Bagaimana cara membaca input keyboard?

123

Saya ingin membaca data dari keyboard dengan python

Saya coba ini:

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

Tapi itu tidak berhasil, baik dengan gerhana maupun di terminal, itu selalu menghentikan pertanyaan. Saya dapat mengetikkan angka tetapi setelah tidak ada yang terjadi.

Apa kamu tahu kenapa?

tranen
sumber
12
Saya cukup yakin OP hanya lupa menekan Return setelah memasukkan angka, dan tidak ada jawaban yang benar-benar menjawab pertanyaan tersebut.
Aran-Fey

Jawaban:

127

mencoba

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

dan jika Anda ingin memiliki nilai numerik, konversikan saja:

try:
    mode=int(raw_input('Input:'))
except ValueError:
    print "Not a number"
lebih tajam
sumber
2
Versi multi-utas non-pemblokiran, sehingga Anda dapat terus melakukan hal-hal alih-alih memblokir input keyboard: stackoverflow.com/a/53344690/4561887
Gabriel Staples
84

Sepertinya Anda mencampurkan Python yang berbeda di sini (Python 2.x vs. Python 3.x) ... Ini pada dasarnya benar:

nb = input('Choose a number: ')

Masalahnya adalah ini hanya didukung di Python 3. Seperti yang dijawab @sharpner, untuk versi Python (2.x) yang lebih lama, Anda harus menggunakan fungsi raw_input:

nb = raw_input('Choose a number: ')

Jika Anda ingin mengubahnya menjadi angka, maka Anda harus mencoba:

number = int(nb)

... meskipun Anda perlu memperhitungkan bahwa ini dapat menimbulkan pengecualian:

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

Dan jika Anda ingin mencetak nomor menggunakan formatting, Python 3 str.format()direkomendasikan:

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

Dari pada:

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

Tetapi kedua opsi ( str.format()dan %) berfungsi dengan Python 2.7 dan Python 3.

Baltasarq
sumber
1
selalu letakkan spacesetelah string Anda agar pengguna memasukkan inputnya jika damai. Enter Tel12340404vs Enter Tel: 12340404. Lihat! : P
Mehrad
Selesai. Terima kasih untuk sarannya.
Baltasarq
15

Contoh non-pemblokiran, multi-utas:

Karena memblokir input keyboard (karena input()blok fungsi) seringkali bukan yang ingin kami lakukan (kami sering ingin terus melakukan hal-hal lain), berikut adalah contoh multi-threaded yang sangat dipreteli untuk mendemonstrasikan cara tetap menjalankan aplikasi utama sambil tetap membaca input keyboard setiap kali mereka tiba .

Ini bekerja dengan membuat satu utas untuk dijalankan di latar belakang, terus-menerus memanggil input()dan kemudian meneruskan data apa pun yang diterimanya ke antrian.

Dengan cara ini, utas utama Anda dibiarkan melakukan apa pun yang diinginkannya, menerima data input keyboard dari utas pertama setiap kali ada sesuatu dalam antrean.

1. Contoh kode Bare Python 3 (tidak ada komentar):

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. Kode Python 3 yang sama seperti di atas, tetapi dengan komentar penjelasan yang ekstensif:

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

Output sampel:

$ python3 read_keyboard_input.py
Siap untuk input keyboard:
hey
input_str = hei
halo
input_str = halo
7000
input_str = 7000
exit
input_str = keluar
Keluar dari terminal serial.
Akhir.

Referensi:

  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: Bagaimana cara membuat subclass dari superclass?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

Terkait / Tautan Silang:

  1. Loop baca non-pemblokiran PySerial
Gabriel Staples
sumber
4

input([prompt])setara dengan eval(raw_input(prompt))dan tersedia sejak python 2.6

Karena tidak aman (karena eval), raw_input harus dipilih untuk aplikasi kritis.

jeanM
sumber
1
+1 untuk informasi kecil yang menarik itu, meskipun saya menandai ini karena ini seharusnya dicantumkan sebagai komentar pada pertanyaan atau jawaban karena itu bukan jawaban yang benar-benar dalam dan dari dirinya sendiri.
ArtOfWarfare
3
Ini juga hanya berlaku untuk Python 2.x. Dengan Python 3.x. raw_inputdiubah namanya menjadi inputdan TIDAK eval.
Jason S
1
Ini tidak memberikan jawaban atas pertanyaan tersebut. Untuk mengkritik atau meminta klarifikasi dari seorang penulis, tinggalkan komentar di bawah postingannya.
Eric Stein
@EricStein - Bendera saya ditolak, dan setelah beberapa refleksi, saya setuju bahwa saya menandai terlalu tergesa-gesa. Lihat ini: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
4

Ini seharusnya berhasil

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)
Antoine
sumber
7
Apa bedanya dengan saran jawaban lain input()?
David Makogon