¿Cómo leer la entrada de teclado?


123

Me gustaría leer datos del teclado en Python

Intento esto:

nb = input('Choose a number')
print ('Number%s \n' % (nb))

Pero no funciona, ni con eclipse ni en la terminal, siempre se detiene la pregunta. Puedo escribir un número pero después no pasa nada.

¿Sabes por qué?


12
Estoy bastante seguro de que el OP simplemente olvidó presionar Retorno después de ingresar un número, y ninguna de las respuestas responde realmente a la pregunta.
Aran-Fey

Respuestas:


127

tratar

raw_input('Enter your input:')  # If you use Python 2
input('Enter your input:')      # If you use Python 3

y si quieres tener un valor numérico simplemente conviértelo:

try:
    mode=int(raw_input('Input:'))
except ValueError:
    print "Not a number"

2
Versión multiproceso sin bloqueo, por lo que puede seguir haciendo cosas en lugar de bloquear en la entrada del teclado: stackoverflow.com/a/53344690/4561887
Gabriel Staples

84

Parece que estás mezclando diferentes pitones aquí (Python 2.x vs. Python 3.x) ... Esto es básicamente correcto:

nb = input('Choose a number: ')

El problema es que solo es compatible con Python 3. Como respondió @sharpner, para versiones anteriores de Python (2.x), debe usar la función raw_input:

nb = raw_input('Choose a number: ')

Si desea convertir eso en un número, entonces debe intentar:

number = int(nb)

... aunque debe tener en cuenta que esto puede generar una excepción:

try:
    number = int(nb)
except ValueError:
    print("Invalid number")

Y si desea imprimir el número con formato, str.format()se recomienda en Python 3 :

print("Number: {0}\n".format(number))

En vez de:

print('Number %s \n' % (nb))

Pero ambas opciones ( str.format()y %) funcionan tanto en Python 2.7 como en Python 3.


1
siempre ponga un spacedespués de su cadena para que el usuario ingrese su entrada si paz. Enter Tel12340404vs Enter Tel: 12340404. ¡ver! : P
Mehrad

Hecho. Gracias por la sugerencia.
Baltasarq

15

Sin bloqueo, ejemplo de subprocesos múltiples:

Dado que el bloqueo en la entrada del teclado (ya que los input()bloques de funciones) con frecuencia no es lo que queremos hacer (con frecuencia nos gustaría seguir haciendo otras cosas), aquí hay un ejemplo multiproceso muy simplificado para demostrar cómo seguir ejecutando su aplicación principal mientras sigue leyendo en las entradas del teclado cada vez que llegan .

Esto funciona creando un subproceso para ejecutar en segundo plano, llamando continuamente input()y luego pasando cualquier dato que reciba a una cola.

De esta manera, su hilo principal se deja hacer lo que quiera, recibiendo los datos de entrada del teclado del primer hilo siempre que haya algo en la cola.

1. Ejemplo de código Bare Python 3 (sin comentarios):

import threading
import queue
import time

def read_kbd_input(inputQueue):
    print('Ready for keyboard input:')
    while (True):
        input_str = input()
        inputQueue.put(input_str)

def main():
    EXIT_COMMAND = "exit"
    inputQueue = queue.Queue()

    inputThread = threading.Thread(target=read_kbd_input, args=(inputQueue,), daemon=True)
    inputThread.start()

    while (True):
        if (inputQueue.qsize() > 0):
            input_str = inputQueue.get()
            print("input_str = {}".format(input_str))

            if (input_str == EXIT_COMMAND):
                print("Exiting serial terminal.")
                break

            # Insert your code here to do whatever you want with the input_str.

        # The rest of your program goes here.

        time.sleep(0.01) 
    print("End.")

if (__name__ == '__main__'): 
    main()

2. El mismo código de Python 3 que el anterior, pero con extensos comentarios explicativos:

"""
read_keyboard_input.py

Gabriel Staples
www.ElectricRCAircraftGuy.com
14 Nov. 2018

References:
- https://pyserial.readthedocs.io/en/latest/pyserial_api.html
- *****https://www.tutorialspoint.com/python/python_multithreading.htm
- *****https://en.wikibooks.org/wiki/Python_Programming/Threading
- /programming/1607612/python-how-do-i-make-a-subclass-from-a-superclass
- https://docs.python.org/3/library/queue.html
- https://docs.python.org/3.7/library/threading.html

To install PySerial: `sudo python3 -m pip install pyserial`

To run this program: `python3 this_filename.py`

"""

import threading
import queue
import time

def read_kbd_input(inputQueue):
    print('Ready for keyboard input:')
    while (True):
        # Receive keyboard input from user.
        input_str = input()

        # Enqueue this input string.
        # Note: Lock not required here since we are only calling a single Queue method, not a sequence of them 
        # which would otherwise need to be treated as one atomic operation.
        inputQueue.put(input_str)

def main():

    EXIT_COMMAND = "exit" # Command to exit this program

    # The following threading lock is required only if you need to enforce atomic access to a chunk of multiple queue
    # method calls in a row.  Use this if you have such a need, as follows:
    # 1. Pass queueLock as an input parameter to whichever function requires it.
    # 2. Call queueLock.acquire() to obtain the lock.
    # 3. Do your series of queue calls which need to be treated as one big atomic operation, such as calling
    # inputQueue.qsize(), followed by inputQueue.put(), for example.
    # 4. Call queueLock.release() to release the lock.
    # queueLock = threading.Lock() 

    #Keyboard input queue to pass data from the thread reading the keyboard inputs to the main thread.
    inputQueue = queue.Queue()

    # Create & start a thread to read keyboard inputs.
    # Set daemon to True to auto-kill this thread when all other non-daemonic threads are exited. This is desired since
    # this thread has no cleanup to do, which would otherwise require a more graceful approach to clean up then exit.
    inputThread = threading.Thread(target=read_kbd_input, args=(inputQueue,), daemon=True)
    inputThread.start()

    # Main loop
    while (True):

        # Read keyboard inputs
        # Note: if this queue were being read in multiple places we would need to use the queueLock above to ensure
        # multi-method-call atomic access. Since this is the only place we are removing from the queue, however, in this
        # example program, no locks are required.
        if (inputQueue.qsize() > 0):
            input_str = inputQueue.get()
            print("input_str = {}".format(input_str))

            if (input_str == EXIT_COMMAND):
                print("Exiting serial terminal.")
                break # exit the while loop

            # Insert your code here to do whatever you want with the input_str.

        # The rest of your program goes here.

        # Sleep for a short time to prevent this thread from sucking up all of your CPU resources on your PC.
        time.sleep(0.01) 

    print("End.")

# If you run this Python file directly (ex: via `python3 this_filename.py`), do the following:
if (__name__ == '__main__'): 
    main()

Salida de muestra:

$ python3 read_keyboard_input.py
Listo para entrada de teclado:
hey
input_str = hey
hola
input_str = hola
7000
input_str = 7000
salir
input_str = salir
Salir del terminal serie.
Final.

Referencias

  1. https://pyserial.readthedocs.io/en/latest/pyserial_api.html
  2. ***** https://www.tutorialspoint.com/python/python_multithreading.htm
  3. ***** https://en.wikibooks.org/wiki/Python_Programming/Threading
  4. Python: ¿Cómo hago una subclase a partir de una superclase?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

Relacionados / entrecruzados:

  1. Bucle de lectura sin bloqueo PySerial

4

input([prompt])es equivalente eval(raw_input(prompt))y está disponible desde python 2.6

Como no es seguro (debido a eval), se debe preferir raw_input para aplicaciones críticas.


1
+1 para ese dato interesante de información, aunque estoy marcando esto porque realmente debe figurar como un comentario sobre la pregunta o una respuesta porque no es realmente una respuesta en sí misma.
ArtOfWarfare

3
También solo es aplicable a Python 2.x. En Python 3.x. raw_inputfue renombrado inputy NO evalúa.
Jason S

1
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
Eric Stein

@EricStein: mi bandera fue rechazada y, después de reflexionar, acepto que marqué demasiado apresuradamente. Vea esto: meta.stackexchange.com/questions/225370/…
ArtOfWarfare

4

Esto debería funcionar

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)

77
¿Cómo es esto diferente de las otras respuestas que sugieren input()?
David Makogon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.