Wie lese ich Tastatureingaben?

123

Ich möchte Daten von der Tastatur in Python lesen

Ich versuche das:

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

Aber es funktioniert weder mit Eclipse noch im Terminal, es ist immer ein Stopp der Frage. Ich kann eine Nummer eingeben, aber nachdem nichts passiert ist.

Weißt du, warum?

tranen
quelle
12
Ich bin mir ziemlich sicher, dass das OP nach Eingabe einer Nummer vergessen hat, die Eingabetaste zu drücken, und keine der Antworten beantwortet die Frage tatsächlich.
Aran-Fey

Antworten:

127

Versuchen

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

und wenn Sie einen numerischen Wert haben möchten, konvertieren Sie ihn einfach:

try:
    mode=int(raw_input('Input:'))
except ValueError:
    print "Not a number"
schärfer
quelle
2
Nicht blockierende Multithread-Version, sodass Sie weiterhin Dinge
Gabriel Staples
84

Es scheint, dass Sie hier verschiedene Pythons mischen (Python 2.x vs. Python 3.x) ... Dies ist im Grunde richtig:

nb = input('Choose a number: ')

Das Problem ist, dass es nur in Python 3 unterstützt wird. Wie @sharpner antwortete, müssen Sie für ältere Versionen von Python (2.x) die folgende Funktion verwenden raw_input:

nb = raw_input('Choose a number: ')

Wenn Sie das in eine Zahl umwandeln möchten, sollten Sie versuchen:

number = int(nb)

... obwohl Sie berücksichtigen müssen, dass dies eine Ausnahme auslösen kann:

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

Wenn Sie die Nummer in Formatierung drucken möchten, wird in Python 3 str.format()empfohlen:

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

Anstatt:

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

Beide Optionen ( str.format()und %) funktionieren jedoch sowohl in Python 2.7 als auch in Python 3.

Baltasarq
quelle
1
Setzen Sie immer eine spacenach Ihrer Zeichenfolge, damit der Benutzer seine Eingabe eingeben kann, wenn Frieden herrscht. Enter Tel12340404vs Enter Tel: 12340404. sehen! : P
Mehrad
Getan. Danke für den Vorschlag.
Baltasarq
15

Nicht blockierendes Beispiel mit mehreren Threads:

Da das Blockieren von Tastatureingaben (da die input()Funktionsblöcke) häufig nicht das ist , was wir tun möchten (wir möchten häufig andere Dinge tun), finden Sie hier ein sehr reduziertes Beispiel mit mehreren Threads , um zu demonstrieren, wie Sie Ihre weiterhin ausführen können Hauptanwendung, während die Tastatureingaben bei jedem Eintreffen noch eingelesen werden .

Dies funktioniert, indem ein Thread erstellt wird, der im Hintergrund ausgeführt wird, kontinuierlich aufgerufen wird input()und dann alle empfangenen Daten an eine Warteschlange übergeben werden.

Auf diese Weise kann Ihr Hauptthread alles tun, was er will, und die Tastatureingabedaten vom ersten Thread empfangen, wenn sich etwas in der Warteschlange befindet.

1. Bare Python 3-Codebeispiel (keine Kommentare):

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. Gleicher Python 3-Code wie oben, jedoch mit ausführlichen Erläuterungen:

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

Beispielausgabe:

$ python3 read_keyboard_input.py
Bereit für Tastatureingaben:
hey
input_str = hey
hallo
input_str = hallo
7000
input_str = 7000
exit
input_str = exit
Beendet das serielle Terminal.
Ende.

Verweise:

  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: Wie erstelle ich eine Unterklasse aus einer Oberklasse?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

Verwandte / Vernetzte:

  1. Nicht blockierende PySerial-Leseschleife
Gabriel Staples
quelle
4

input([prompt])ist äquivalent zu eval(raw_input(prompt))und verfügbar seit Python 2.6

Da es (aufgrund von eval) unsicher ist, sollte raw_input für kritische Anwendungen bevorzugt werden.

jeanM
quelle
1
+1 für diese interessante Information, obwohl ich dies ankündige, weil es wirklich als Kommentar zu der Frage oder als Antwort aufgeführt werden sollte, weil es nicht wirklich eine Antwort an sich ist.
ArtOfWarfare
3
Dies gilt auch nur für Python 2.x. In Python 3.x. raw_inputwurde umbenannt in inputund wird NICHT ausgewertet.
Jason S
1
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Eric Stein
@EricStein - Meine Flagge wurde abgelehnt, und nach einiger Überlegung stimme ich zu, dass ich zu schnell markiert habe. Siehe dies: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
4

Das sollte funktionieren

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)
Antoine
quelle
7
Wie unterscheidet sich das von den anderen vorgeschlagenen Antworten input()?
David Makogon