Comment lire la saisie au clavier?

123

Je voudrais lire les données du clavier en python

J'essaye ceci:

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

Mais ça ne marche pas, ni avec eclipse ni dans le terminal, c'est toujours l'arrêt de la question. Je peux taper un nombre mais après rien ne se passe.

Est-ce que tu sais pourquoi?

tranen
la source
12
Je suis presque sûr que l'OP a simplement oublié d'appuyer sur Retour après avoir entré un nombre, et aucune des réponses ne répond réellement à la question.
Aran-Fey

Réponses:

127

essayer

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

et si vous voulez avoir une valeur numérique, convertissez-la simplement:

try:
    mode=int(raw_input('Input:'))
except ValueError:
    print "Not a number"
plus affûté
la source
2
Version multithread non bloquante, vous pouvez donc continuer à faire des choses au lieu de bloquer sur l'entrée du clavier: stackoverflow.com/a/53344690/4561887
Gabriel Staples
84

Il semble que vous mélangez différents Pythons ici (Python 2.x vs Python 3.x) ... C'est fondamentalement correct:

nb = input('Choose a number: ')

Le problème est qu'il n'est pris en charge qu'en Python 3. Comme @sharpner l'a répondu, pour les anciennes versions de Python (2.x), vous devez utiliser la fonction raw_input:

nb = raw_input('Choose a number: ')

Si vous souhaitez convertir cela en nombre, vous devriez essayer:

number = int(nb)

... mais vous devez tenir compte du fait que cela peut soulever une exception:

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

Et si vous souhaitez imprimer le nombre en utilisant le formatage, en Python 3 str.format()est recommandé:

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

Au lieu de:

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

Mais les deux options ( str.format()et %) fonctionnent à la fois dans Python 2.7 et Python 3.

Baltasarq
la source
1
mettez toujours un spaceaprès votre chaîne pour que l'utilisateur entre son entrée en cas de paix. Enter Tel12340404vs Enter Tel: 12340404. voir! : P
Mehrad
Terminé. Merci pour la suggestion.
Baltasarq
15

Exemple non bloquant et multithread:

Comme le blocage de la saisie au clavier (depuis les input()blocs fonctionnels) n'est souvent pas ce que nous voulons faire (nous aimerions souvent continuer à faire d'autres choses), voici un exemple multithread très simplifié pour montrer comment continuer à exécuter votre application principale tout en lisant les entrées du clavier à chaque fois qu'elles arrivent .

Cela fonctionne en créant un thread à exécuter en arrière-plan, en appelant continuellement input()et en passant toutes les données qu'il reçoit à une file d'attente.

De cette façon, votre thread principal doit faire tout ce qu'il veut, recevant les données d'entrée du clavier du premier thread chaque fois qu'il y a quelque chose dans la file d'attente.

1. Exemple de code Bare Python 3 (sans commentaires):

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. Même code Python 3 que ci-dessus, mais avec de nombreux commentaires explicatifs:

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

Exemple de sortie:

$ python3 read_keyboard_input.py
Prêt pour la saisie au clavier:
hey
input_str = hey
bonjour
input_str = bonjour
7000
input_str = 7000
exit
input_str = exit
Sortie du terminal série.
Fin.

Références:

  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: Comment créer une sous-classe à partir d'une superclasse?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

Liés / croisés:

  1. Boucle de lecture non bloquante PySerial
Gabriel Staples
la source
4

input([prompt])est équivalent eval(raw_input(prompt))et disponible depuis python 2.6

Comme il n'est pas sûr (à cause de eval), raw_input doit être préféré pour les applications critiques.

jeanM
la source
1
+1 pour cette information intéressante, bien que je le signale parce que cela devrait vraiment être répertorié comme un commentaire sur la question ou une réponse parce que ce n'est pas vraiment une réponse en soi.
ArtOfWarfare
3
Il n'est également applicable qu'à Python 2.x. Dans Python 3.x. raw_inputa été renommé inputet n'évalue PAS.
Jason S
1
Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous sa publication.
Eric Stein
@EricStein - Mon drapeau a été refusé, et après réflexion, je reconnais que je l'ai signalé trop rapidement. Voir ceci: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
4

Cela devrait fonctionner

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)
Antoine
la source
7
En quoi est-ce différent des autres réponses suggérées input()?
David Makogon