Respostas:
No Python 3, use input()
:
input("Press Enter to continue...")
No Python 2, use raw_input()
:
raw_input("Press Enter to continue...")
Isso espera apenas que o usuário pressione enter.
Pode-se usar o msvcrt ((somente Windows / DOS) O módulo msvcrt fornece acesso a várias funções na Biblioteca de Tempo de Execução do Microsoft Visual C / C ++ (MSVCRT):
import msvcrt as m
def wait():
m.getch()
Isso deve esperar por um pressionamento de tecla.
Informação adicional:
no Python 3 raw_input()
não existe
No Python 2 input(prompt)
é equivalente aeval(raw_input(prompt))
input
não continua se qualquer tecla for pressionada, apenas se pressionar Enter.
Uma maneira de fazer isso no Python 2 é usar raw_input()
:
raw_input("Press Enter to continue...")
Em python3 é apenas input()
enter
?
input()
.
Na minha caixa linux, eu uso o seguinte código. Isso é semelhante ao código que eu já vi em outros lugares (nas FAQs antigas sobre python, por exemplo), mas esse código gira em um loop apertado, onde esse código não existe e há muitos casos de canto estranhos em que o código não explica isso. código faz.
def read_single_keypress():
"""Waits for a single keypress on stdin.
This is a silly function to call if you need to do it a lot because it has
to store stdin's current setup, setup stdin for reading single keystrokes
then read the single keystroke then revert stdin back after reading the
keystroke.
Returns a tuple of characters of the key that was pressed - on Linux,
pressing keys like up arrow results in a sequence of characters. Returns
('\x03',) on KeyboardInterrupt which can happen when a signal gets
handled.
"""
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
# save old state
flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
attrs_save = termios.tcgetattr(fd)
# make raw - the way to do this comes from the termios(3) man page.
attrs = list(attrs_save) # copy the stored version to update
# iflag
attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
| termios.ISTRIP | termios.INLCR | termios. IGNCR
| termios.ICRNL | termios.IXON )
# oflag
attrs[1] &= ~termios.OPOST
# cflag
attrs[2] &= ~(termios.CSIZE | termios. PARENB)
attrs[2] |= termios.CS8
# lflag
attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
| termios.ISIG | termios.IEXTEN)
termios.tcsetattr(fd, termios.TCSANOW, attrs)
# turn off non-blocking
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
# read a single keystroke
ret = []
try:
ret.append(sys.stdin.read(1)) # returns a single character
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
c = sys.stdin.read(1) # returns a single character
while len(c) > 0:
ret.append(c)
c = sys.stdin.read(1)
except KeyboardInterrupt:
ret.append('\x03')
finally:
# restore old state
termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
return tuple(ret)
Se você concorda com os comandos do sistema, pode usar o seguinte:
Linux:
import os
os.system('read -sn 1 -p "Press any key to continue..."')
print
Janelas:
import os
os.system("pause")
system
e depois ligar sys.exit(0)
.
Simplesmente usando
input("Press Enter to continue...")
causará um SyntaxError: EOF esperado durante a análise.
Uso de correção simples:
try:
input("Press enter to continue")
except SyntaxError:
pass
input
no python 2 - a função correta é raw_input
. No python 2, input
é equivalente a eval(raw_input())
.
O manual python fornece o seguinte:
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
try:
while 1:
try:
c = sys.stdin.read(1)
print "Got character", repr(c)
except IOError: pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
que pode ser acumulado no seu caso de uso.
Plataforma cruzada, código Python 2/3:
# import sys, os
def wait_key():
''' Wait for a key press on the console and return it. '''
result = None
if os.name == 'nt':
import msvcrt
result = msvcrt.getch()
else:
import termios
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
try:
result = sys.stdin.read(1)
except IOError:
pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
return result
Eu removi o material fctl / non-blocking porque estava dando IOError
s e não precisava dele. Estou usando esse código especificamente porque quero que ele bloqueie. ;)
Termo aditivo:
Eu implementei isso em um pacote no PyPI com muitos outros itens chamados console :
>>> from console.utils import wait_key
>>> wait_key()
'h'
Não conheço uma maneira independente de fazê-lo, mas no Windows, se você usar o módulo msvcrt, poderá usar a função getch:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
O mscvcrt também inclui a função kbhit () sem bloqueio para verificar se uma tecla foi pressionada sem aguardar (não tenho certeza se há uma função de maldições correspondente). No UNIX, existe o pacote maldições, mas não tenho certeza se você pode usá-lo sem usá-lo para toda a saída da tela. Este código funciona no UNIX:
import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()
Observe que curses.getch () retorna o ordinal da tecla pressionada, para que ela tenha a mesma saída que eu tive para convertê-la.
Se você deseja aguardar a entrada (para que o usuário toque no teclado não faça com que algo não intencional aconteça), use
sys.stdin.readline()
Eu sou novo no python e já estava pensando que sou burro demais para reproduzir as sugestões mais simples feitas aqui. Acontece que há uma armadilha que se deve saber:
Quando um script python é executado a partir do IDLE, alguns comandos de E / S parecem se comportar completamente diferentes (como na verdade não há janela de terminal).
Por exemplo. O msvcrt.getch é sem bloqueio e sempre retorna $ ff. Isso já foi relatado há muito tempo (veja, por exemplo, https://bugs.python.org/issue9290 ) - e está marcado como corrigido, de alguma forma o problema parece persistir nas versões atuais do python / IDLE.
Portanto, se algum código postado acima não funcionar, tente executar o script manualmente e NÃO a partir do IDLE .
Se você quiser ver se eles pressionaram uma tecla exata (como digamos 'b'), faça o seguinte:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
o os.system parece sempre chamar sh, que não reconhece as opções s e n para leitura. No entanto, o comando read pode ser passado para o bash:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")