2009-06-11 24 views

Respuesta

280

En Python 3, no existe raw_input(). Por lo tanto, sólo tiene que utilizar:

input("Press Enter to continue...") 

Esto sólo espera a que el usuario pulse entrar, sin embargo, por lo que es posible que desee utilizar msvcrt ((Windows/DOS) El módulo msvcrt le da acceso a una serie de funciones en Microsoft Visual C/C++ Runtime Library (MSVCRT)):

import msvcrt as m 
def wait(): 
    m.getch() 

Esto debería esperar a que se presione una tecla.

+39

Recibo este error cuando trato de hacer esto en Python 2.7: "SyntaxError: inesperado EOF al analizar " –

+0

@richard muchas personas usan Windows, por lo que +1. – Solarsaturn9

+6

@ Solarsaturn9 y un número cada vez mayor no lo hace. Por lo tanto, esta respuesta no funcionó para mí, y muchos otros que vienen aquí. –

271

Una forma de hacer esto en Python 2, es utilizar raw_input():

raw_input("Press Enter to continue...") 

En python3 es sólo input()

+14

¿Qué pasa cuando puede ser una de una serie de claves? No solo 'enter'? – noio

+32

[Con Python 3+] (http://stackoverflow.com/questions/954834/easy-how-to-use-raw-input-in-3-1), esto ha cambiado a 'entrada()'. – palswim

+2

http://stackoverflow.com/questions/1394956/how-to-do-hit-any-key-in-python –

14

La pitón manual 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 puede ser enrollado en su caso de uso.

+10

Es una buena práctica copiar lo que está enlazando para que el conocimiento permanezca, incluso si el enlace muere (¡y lo hacen!). – Richard

+1

¿Cómo puedo hacer que esto funcione en Python 3.x? En 3.x, después de cambiar la declaración de impresión para que sea compatible, esto simplemente se repite infinitamente y no espera la entrada. Sin embargo, funciona muy bien en Python 2. – cat

+0

El enlace se ha actualizado para redirigir a una página diferente. El nuevo enlace es [aquí.] (Https://docs.python.org/2/faq/library.html # how-do-i-get-a-single-keypress-at-a-time) – Matthias

11

no sé de una manera independiente de la plataforma de hacerlo, pero en Windows, si se utiliza el módulo de msvcrt, puede utilizar su función getch:

import msvcrt 
c = msvcrt.getch() 
print 'you entered', c 

mscvcrt también incluye la no-bloqueo Función kbhit() para ver si se presionó una tecla sin esperar (no estoy seguro de si hay una función de maldición correspondiente). En UNIX, existe el paquete de curses, pero no estoy seguro si puede usarlo sin usarlo para todo el resultado 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 pulsada por lo que hacen que tiene la misma salida que tuve que echarlo.

+0

Usar curses es mucho más agradable que los ejemplos algo intrincados descritos en el manual, incluso si implica una gran dependencia. +1 – Damian

37

En mi cuadro Linux, uso el siguiente código. Esto es similar a la entrada manual mencionada en otra parte, pero ese código gira en un bucle cerrado donde este código no y hay muchos casos de esquina impares que el código no da cuenta de que este 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 the character of the key that was pressed (zero 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 
    try: 
     ret = sys.stdin.read(1) # returns a single character 
    except KeyboardInterrupt: 
     ret = 0 
    finally: 
     # restore old state 
     termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save) 
     fcntl.fcntl(fd, fcntl.F_SETFL, flags_save) 
    return ret 
+0

Si bien esta es mi respuesta favorita aquí, al igual que las demás, no detecta cosas como desplazamiento, control, etc. – Mala

+0

Esta es quizás una de las respuestas más útiles sobre SO. – cat

+1

@Mala eso no es posible en Python puro; tal vez deberías escribir un módulo C? – cat

1

Si desea ver si se pulsa una tecla exacta (como decir 'b') Haga lo siguiente:

while True: 
    choice = raw_input("> ") 

    if choice == 'b' : 
     print "You win" 
     input("yay") 
     break 
+3

Esto requiere que el usuario escriba 'b' (u otra cosa) luego presione enter, que es bastante diferente de lo que el OP está pidiendo. –

22

Si estás bien con función de sistema de comandos que puede utilizar lo siguiente:

Linux:

os.system('read -s -n 1 -p "Press any key to continue..."') 
print 

de Windows:

os.system("pause") 
0

os.system parece invocar siempre sh, que no reconoce las opciones syn de lectura.Sin embargo, el comando de lectura se puede pasar a golpear:

os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""") 
+2

La documentación de lectura me hace pensar que no se agotará el tiempo de espera a menos que especifique la opción -t. –

15

Simplemente usando

input("Press Enter to continue...") 

provocará una SyntaxError: EOF espera mientras se analizaba.

simple uso del arreglo:

try: 
    input("Press enter to continue") 
except SyntaxError: 
    pass 
+4

No use 'input' en python 2 - la función correcta es' raw_input'. En python 2, 'input' es equivalente a' eval (raw_input()) '. – Blorgbeard

+0

Esto ignora todas las teclas que el usuario presiona, hasta que presionen enter, que es bastante diferente de lo que el OP está pidiendo. –

+1

Además, si iba a usar 'entrada', capturar un SyntaxError no es apropiado. Independientemente de los tipos de usuario que se evalúen, si, por ejemplo, escriben "1/0", se genera un ZeroDivisionError en lugar de un SyntaxError, y su programa se cerrará. –

-4

o que podría hacer

print("This is a good joke") 
print("what happened when the chicken crossed the road") 
gap = input("") 
if gap == (""): 
    print("") 
else: 
    print("") 
print("it died") 
+2

Esto ignora todas las teclas que el usuario presiona hasta que presionen enter, que es bastante diferente de lo que el OP está pidiendo. –

+0

Me hizo reír pero no ayudó a nadie. –

10

Plataforma Cruz, Python 2/3 código:

# 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 

Quité el FCTL/no -bloqueando cosas porque estaba dando IOError sy yo no lo hice lo necesito Estoy usando este código específicamente porque quiero que bloquee. ;)

2

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 de python desde IDLE, algunos comandos de IO parecen comportarse completamente diferente (ya que en realidad no hay ventana de terminal).

Por ejemplo. msvcrt.getch no bloquea y siempre devuelve $ ff. Esto ya se informó hace mucho tiempo (consulte, por ejemplo, https://bugs.python.org/issue9290), y está marcado como arreglado; de alguna manera, el problema parece persistir en las versiones actuales de python/IDLE.

Por lo tanto, si alguno de los códigos publicados anteriormente no funciona para usted, intente ejecutar el script manualmente, y NO desde el IDLE.

Cuestiones relacionadas