127 votes

Comment lire les données du clavier ?

Je voudrais lire des données à partir du clavier en python

J'essaie ça :

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.

Vous savez pourquoi ?

12 votes

Je suis presque sûr que le PO a juste oublié d'appuyer sur Retour après avoir entré un nombre, et aucune des réponses ne répond réellement à la question.

131voto

sharpner Points 1454

Essayez

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 il suffit de la convertir :

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

2 votes

Version multithread non bloquante, pour que vous puissiez continuer à faire des choses au lieu de bloquer sur l'entrée du clavier : stackoverflow.com/a/53344690/4561887

87voto

Baltasarq Points 5164

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

nb = input('Choose a number: ')

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

nb = raw_input('Choose a number: ')

Si vous voulez convertir cela en un nombre, alors 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 voulez 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() y % ) fonctionnent à la fois dans Python 2.7 et Python 3.

1 votes

Toujours mettre un space après votre chaîne de caractères pour que l'utilisateur puisse saisir son entrée si la paix. Enter Tel12340404 vs Enter Tel: 12340404 . voir ! :P

0 votes

Fait. Merci pour la suggestion.

22voto

Gabriel Staples Points 1804

Exemple non bloquant et multithread :

Comme le blocage de la saisie au clavier (puisque l input() blocs fonctionnels) est fréquemment no ce que nous voulons faire (nous aimerions fréquemment continuer à faire d'autres choses), voici une exemple multithreading très dépouillé pour démontrer comment continuer à exécuter l'application principale tout en lisant les entrées du clavier dès qu'elles arrivent ? . J'utilise cette technique dans mes eRCaGuy_PyTerm programme de terminal série ici (recherchez dans le code input() ) .

Cela fonctionne en créant un thread qui tourne en arrière-plan et qui appelle continuellement input() puis transmet toutes les données qu'il reçoit à une file d'attente.

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

1. Exemple de code Python 3 nu (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
- https://stackoverflow.com/questions/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 :

input_str = hey
Bonjour
input_str = bonjour
7000
input_str = 7000
quitter
input_str = exit
Sortie du terminal série.
Fin.

La bibliothèque Python Queue est thread-safe :

Notez que Queue.put() y Queue.get() et les autres méthodes de la classe Queue sont toutes thread-safe ! (Ceci est contrairement à les files d'attente et autres conteneurs dans la bibliothèque de modèles standard en C++ !) Puisque la classe Python Queue et ses méthodes sont thread-safe, cela signifie qu'elles implémentent toute la sémantique de verrouillage interne requise pour les opérations inter-threads, de sorte que chaque appel de fonction dans la classe queue peut être considéré comme une opération unique et atomique. Voir les notes en haut de la documentation : https://docs.python.org/3/library/queue.html (accentuation ajoutée) :

Le module de file d'attente met en œuvre des files d'attente multi-producteurs et multi-consommateurs. Il est particulièrement utile dans la programmation threadée lorsque des informations doivent être échangées en toute sécurité entre plusieurs threads. La classe Queue dans ce module implémente toute la sémantique de verrouillage requise .

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 super-classe ?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html
  7. [Mon repo où j'utilise les techniques et le code présentés ci-dessus]. https://github.com/ElectricRCAircraftGuy/eRCaGuy_PyTerm

Relié/Croisé :

  1. [ma réponse] Boucle de lecture non-bloquante PySerial

0 votes

@Tim, je pense que les modifications que vous avez proposées étaient trop drastiques et ont rendu le message plus personnel que le mien. Je les ai donc rejetées. Lorsque vous modifiez les messages d'autres personnes, il est préférable de se concentrer sur la correction du contenu erroné, l'amélioration du formatage ou de la grammaire, ou la correction de l'orthographe. Les modifications importantes du code ou la réécriture complète d'une réponse ne doivent pas être effectuées. Si vous souhaitez apporter autant de modifications, il est préférable d'écrire votre propre réponse. Voici un exemple où j'ai fait cela : stackoverflow.com/a/38809894/4561887 . J'ai complètement réécrit son code. N'oubliez pas de citer vos sources et de rendre à César ce qui appartient à César.

0 votes

J'apprécie la réponse originale, @Gabriel. Elle m'a aidé. Merci ! :) J'espérais que les nombreux petits changements pour satisfaire pylint, améliorer le format et la grammaire, et supprimer les références inutilisées à pyserial (ironiquement, la raison pour laquelle j'ai trouvé cette réponse) s'ajouteraient à un nettoyage bienvenu. Je suis déçu que ce ne soit pas le cas, et je m'en excuse humblement. J'ai le code révisé, mais SO ne semble pas garder proposée les modifications. Je ne posterai pas de copie/mise à jour de cette réponse, mais je vous prie de bien vouloir incorporer les modifications directement et librement comme étant les vôtres. Merci !

4voto

jeanM Points 116

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.

0voto

W1L7 Points 35

Vous pouvez simplement utiliser la fonction input() en utilisant une variable. exemple rapide !

user = input("Enter any text: ")
print(user)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X