web-dev-qa-db-fra.com

Comment lire les saisies au clavier?

J'aimerais lire les données du clavier en python

J'essaye ceci:

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

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

Est-ce que tu sais pourquoi?

115
tranen

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"
120
sharpner

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

nb = input('Choose a number: ')

Le problème est qu'il n'est pris en charge que dans 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 nombre, vous devriez alors essayer:

number = int(nb)

... bien que vous deviez prendre en compte que cela peut déclencher une exception:

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

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

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.

83
Baltasarq

Exemple multithread non bloquant:

Comme bloquer sur la saisie au clavier (puisque la fonction input() bloque) est souvent pas ce que nous voulons faire (nous aimerions souvent continuer à faire d'autres choses), voici un exemple multi-thread très dépouillé pour montrer comment continuer à exécuter votre application principale tout en continuant la lecture les entrées au clavier quand elles arrivent .

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

De cette façon, votre thread principal est libre de 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 Python 3 nu (sans commentaire):

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 (__== '__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 (__== '__main__'): 
    main()

Exemple de sortie:

$ python3 read_keyboard_input.py
Prêt pour la saisie au clavier:
Hey
input_str = hey
salut
input_str = bonjour
7000
input_str = 7000
sortie
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
7
Gabriel Staples

Cela devrait marcher

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

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

Comme il est dangereux (à cause de eval), raw_input devrait être préféré pour les applications critiques.

4
jeanM