Respuestas:
En Python 3 use input()
:
input("Press Enter to continue...")
En Python 2 use raw_input()
:
raw_input("Press Enter to continue...")
Sin embargo, esto solo espera a que el usuario presione enter.
Es posible que desee usar msvcrt ((solo Windows / DOS) El módulo msvcrt le da acceso a una serie de funciones en la Biblioteca de tiempo de ejecución de Microsoft Visual C / C ++ (MSVCRT):
import msvcrt as m
def wait():
m.getch()
Esto debería esperar a que se presione una tecla.
Información adicional:
en Python 3 raw_input()
no existe
En Python 2 input(prompt)
es equivalente aeval(raw_input(prompt))
input
no continúa si se presiona alguna tecla, solo si se presiona enter.
Una forma de hacer esto en Python 2 es usar raw_input()
:
raw_input("Press Enter to continue...")
En python3 es solo input()
enter
?
input()
.
En mi caja de Linux, uso el siguiente código. Esto es similar al código que he visto en otros lugares (por ejemplo, en las preguntas frecuentes anteriores de Python), pero ese código gira en un bucle cerrado donde este código no lo hace y hay muchos casos de esquinas extrañas que el código no tiene en cuenta. El código lo hace.
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)
Si está de acuerdo con los comandos del sistema, puede usar lo siguiente:
Linux:
import os
os.system('read -sn 1 -p "Press any key to continue..."')
print
Ventanas:
import os
os.system("pause")
system
y luego llamar sys.exit(0)
.
Simplemente usando
input("Press Enter to continue...")
causará un SyntaxError: EOF esperado durante el análisis.
Uso de arreglo simple:
try:
input("Press enter to continue")
except SyntaxError:
pass
input
en python 2: la función correcta es raw_input
. En python 2, input
es equivalente a eval(raw_input())
.
El manual de Python proporciona lo siguiente:
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 se puede incluir en su 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
Eliminé el material fctl / sin bloqueo porque estaba dando IOError
sy no lo necesitaba. Estoy usando este código específicamente porque quiero que se bloquee. ;)
Apéndice:
Implementé esto en un paquete en PyPI con muchas otras cosas llamadas consola :
>>> from console.utils import wait_key
>>> wait_key()
'h'
No conozco una forma independiente de plataforma de hacerlo, pero en Windows, si usa el módulo msvcrt, puede usar su función getch:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
mscvcrt también incluye la función kbhit () sin bloqueo para ver si se presionó una tecla sin esperar (no estoy seguro si hay una función de maldición correspondiente). Bajo UNIX, está el paquete curses, pero no estoy seguro si puede usarlo sin usarlo para toda la salida de la pantalla. Este código funciona bajo UNIX:
import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()
Tenga en cuenta que curses.getch () devuelve el ordinal de la tecla presionada para que tenga la misma salida que tuve que lanzar.
Si desea esperar para ingresar (para que el usuario golpee el teclado no provoque que suceda algo inesperado) use
sys.stdin.readline()
Soy nuevo en Python y ya estaba pensando que soy demasiado estúpido para reproducir las sugerencias más simples hechas aquí. Resulta que hay una trampa que uno debería saber:
Cuando se ejecuta un script python desde IDLE, algunos comandos IO parecen comportarse de manera completamente diferente (ya que en realidad no hay una ventana de terminal).
P.ej. msvcrt.getch no bloquea y siempre devuelve $ ff. Esto ya se informó hace mucho tiempo (ver, por ejemplo, https://bugs.python.org/issue9290 ), y está marcado como solucionado, de alguna manera el problema parece persistir en las versiones actuales de python / IDLE.
Entonces, si alguno de los códigos publicados anteriormente no funciona para usted, intente ejecutar el script manualmente y NO desde IDLE .
Si desea ver si presionaron una tecla exacta (como decir 'b') Haga esto:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
os.system parece invocar siempre sh, que no reconoce las opciones syn para leer. Sin embargo, el comando de lectura se puede pasar a bash:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")