Come leggere l'input da tastiera?


123

Vorrei leggere i dati dalla tastiera in Python

Provo questo:

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

Ma non funziona, né con eclipse né nel terminale, è sempre il punto fermo. Posso digitare un numero ma dopo non succede niente.

Sai perché?


12
Sono abbastanza sicuro che l'OP si sia appena dimenticato di premere Invio dopo aver inserito un numero e nessuna delle risposte risponde effettivamente alla domanda.
Aran-Fey

Risposte:


127

provare

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

e se vuoi avere un valore numerico basta convertirlo:

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

2
Versione multi-thread non bloccante, quindi puoi continuare a fare cose invece di bloccare l'input da tastiera: stackoverflow.com/a/53344690/4561887
Gabriel Staples

84

Sembra che tu stia mescolando diversi Pythons qui (Python 2.x vs Python 3.x) ... Questo è fondamentalmente corretto:

nb = input('Choose a number: ')

Il problema è che è supportato solo in Python 3. Come ha risposto @sharpner, per le versioni precedenti di Python (2.x), devi usare la funzione raw_input:

nb = raw_input('Choose a number: ')

Se vuoi convertirlo in un numero, dovresti provare:

number = int(nb)

... anche se devi tenere in considerazione che questo può sollevare un'eccezione:

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

E se vuoi stampare il numero usando la formattazione, in Python 3 str.format()è consigliato:

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

Invece di:

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

Ma entrambe le opzioni ( str.format()e %) funzionano sia in Python 2.7 che in Python 3.


1
metti sempre un spacedopo la tua stringa per consentire all'utente di inserire il suo input se la pace. Enter Tel12340404vs Enter Tel: 12340404. vedere! : P
Mehrad

Fatto. Grazie per il suggerimento.
Baltasarq

15

Esempio non bloccante, multi-thread:

Poiché il blocco sull'input da tastiera (poiché i input()blocchi funzione) spesso non è ciò che vogliamo fare (spesso vorremmo continuare a fare altre cose), ecco un esempio multi-thread molto ridotto per dimostrare come continuare a eseguire il tuo principale durante la lettura degli input da tastiera ogni volta che arrivano .

Funziona creando un thread da eseguire in background, chiamando continuamente input()e quindi passando tutti i dati ricevuti a una coda.

In questo modo, il tuo thread principale è lasciato a fare tutto ciò che vuole, ricevendo i dati di input dalla tastiera dal primo thread ogni volta che c'è qualcosa in coda.

1. Esempio di codice Bare Python 3 (nessun commento):

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. Stesso codice Python 3 come sopra, ma con ampi commenti esplicativi:

"""
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()

Output di esempio:

$ python3 read_keyboard_input.py
Pronto per l'input da tastiera:
hey
input_str = hey
ciao
input_str = ciao
7000
input_str = 7000
exit
input_str = exit
Uscita dal terminale seriale.
Fine.

Riferimenti:

  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: come si crea una sottoclasse da una superclasse?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

Related / reticolato:

  1. PySerial ciclo di lettura non bloccante

4

input([prompt])è equivalente eval(raw_input(prompt))e disponibile a partire da python 2.6

Poiché non è sicuro (a causa di eval), raw_input dovrebbe essere preferito per le applicazioni critiche.


1
+1 per quell'interessante bocconcino di informazioni, anche se lo contrassegno perché in realtà dovrebbe essere elencato come un commento alla domanda o una risposta perché non è davvero una risposta di per sé.
ArtOfWarfare

3
È inoltre applicabile solo a Python 2.x. In Python 3.x. raw_inputè stato rinominato inpute NON valuta.
Jason S

1
Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
Eric Stein

@EricStein - La mia bandiera è stata rifiutata e, dopo qualche riflessione, sono d'accordo di averla segnalata troppo frettolosamente. Vedi questo: meta.stackexchange.com/questions/225370/…
ArtOfWarfare

4

Questo dovrebbe funzionare

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

7
In che modo questo è diverso dalle altre risposte suggerite input()?
David Makogon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.