Jak czytać dane wprowadzane z klawiatury?

123

Chciałbym odczytać dane z klawiatury w pythonie

Próbuję tego:

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

Ale to nie działa, ani z zaćmieniem, ani w terminalu, zawsze kończy się pytaniem. Mogę wpisać numer, ale nic się nie dzieje.

Wiesz dlaczego?

tranen
źródło
12
Jestem prawie pewien, że OP po prostu zapomniał nacisnąć klawisz Return po wprowadzeniu liczby, a żadna z odpowiedzi nie odpowiada na pytanie.
Aran-Fey

Odpowiedzi:

127

próbować

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

a jeśli chcesz mieć wartość liczbową, po prostu ją przekonwertuj:

try:
    mode=int(raw_input('Input:'))
except ValueError:
    print "Not a number"
Sharpner
źródło
2
Nieblokująca wersja wielowątkowa, dzięki której możesz robić rzeczy zamiast blokować dane wejściowe z klawiatury: stackoverflow.com/a/53344690/4561887
Gabriel Staples
84

Wygląda na to, że mieszasz tutaj różne Pythony (Python 2.x vs. Python 3.x) ... Zasadniczo jest to poprawne:

nb = input('Choose a number: ')

Problem w tym, że jest on obsługiwany tylko w Pythonie 3. Jak odpowiedział @sharpner, dla starszych wersji Pythona (2.x) musisz użyć funkcji raw_input:

nb = raw_input('Choose a number: ')

Jeśli chcesz przekonwertować to na liczbę, powinieneś spróbować:

number = int(nb)

... chociaż musisz wziąć pod uwagę, że może to spowodować wyjątek:

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

A jeśli chcesz wydrukować liczbę przy użyciu formatowania, w Pythonie 3 str.format()jest zalecane:

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

Zamiast:

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

Ale obie opcje ( str.format()i %) działają zarówno w Pythonie 2.7 i Pythonie 3.

Baltasarq
źródło
1
zawsze umieszczaj spacepo swoim ciągu, aby użytkownik wprowadził swoje dane wejściowe, jeśli pokój. Enter Tel12340404vs Enter Tel: 12340404. widzieć! : P
Mehrad
Gotowe. Dzieki za sugestie.
Baltasarq
15

Nieblokujący, wielowątkowy przykład:

Ponieważ blokowanie danych wejściowych z klawiatury (od input()bloków funkcyjnych) często nie jest tym, co chcemy robić (często chcielibyśmy robić inne rzeczy), oto bardzo uproszczony wielowątkowy przykład pokazujący, jak nadal uruchamiać głównej aplikacji, podczas gdy nadal czyta dane wejściowe klawiatury, gdy tylko się pojawią .

Działa to poprzez utworzenie jednego wątku do działania w tle, ciągłe wywoływanie, input()a następnie przekazywanie wszelkich otrzymanych danych do kolejki.

W ten sposób twój główny wątek może robić wszystko, co zechce, otrzymując dane wejściowe klawiatury z pierwszego wątku, gdy jest coś w kolejce.

1. Przykład kodu Bare Python 3 (bez komentarzy):

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. Ten sam kod Python 3 jak powyżej, ale z obszernymi komentarzami wyjaśniającymi:

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

Przykładowe dane wyjściowe:

$ python3 read_keyboard_input.py
Gotowy do wprowadzania danych z klawiatury:
hej
input_str = hey
hello
input_str = hello
7000
input_str = 7000
exit
input_str = exit
Wychodzenie z terminala szeregowego.
Koniec.

Bibliografia:

  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: Jak utworzyć podklasę z nadklasy?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

Powiązane / powiązane:

  1. Nieblokująca pętla odczytu PySerial
Gabriel Staples
źródło
4

input([prompt])jest równoważne eval(raw_input(prompt))i dostępne od wersji Pythona 2.6

Ponieważ jest to niebezpieczne (ze względu na eval), dla aplikacji krytycznych należy preferować raw_input.

jeanM
źródło
1
+1 za tę interesującą ciekawostkę informacji, chociaż zaznaczam to, ponieważ naprawdę nie ma znaczenia, aby być wymienionym jako komentarz do pytania lub odpowiedzi, ponieważ nie jest to odpowiedź sama w sobie.
ArtOfWarfare
3
Dotyczy to również tylko Pythona 2.x. W Pythonie 3.x. raw_inputzostał przemianowany na inputi NIE eval.
Jason S,
1
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem.
Eric Stein
@EricStein - Moja flaga została odrzucona i po zastanowieniu zgadzam się, że zgłosiłem zbyt szybko. Zobacz to: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
4

To powinno działać

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)
Antoine
źródło
7
Czym to się różni od innych sugerujących odpowiedzi input()?
David Makogon,