Làm thế nào để đọc đầu vào bàn phím?


123

Tôi muốn đọc dữ liệu từ bàn phím bằng python

Tôi thử điều này:

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

Nhưng nó không hoạt động, không có nhật thực hay trong thiết bị đầu cuối, nó luôn luôn dừng lại câu hỏi. Tôi có thể gõ một số nhưng sau khi không có gì xảy ra.

Bạn có biết tại sao?


12
Tôi khá chắc chắn rằng OP chỉ quên nhấn Return sau khi nhập số và không có câu trả lời nào thực sự trả lời câu hỏi.
Aran-Fey

Câu trả lời:


127

thử

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

và nếu bạn muốn có một giá trị số, chỉ cần chuyển đổi nó:

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

2
Phiên bản đa luồng không chặn, vì vậy bạn có thể tiếp tục thực hiện công việc thay vì chặn trên đầu vào bàn phím: stackoverflow.com/a/53344690/4561887
Gabriel Staples

84

Có vẻ như bạn đang trộn các Pythons khác nhau ở đây (Python 2.x so với Python 3.x) ... Điều này về cơ bản là chính xác:

nb = input('Choose a number: ')

Vấn đề là nó chỉ được hỗ trợ trong Python 3. Như @sharpner đã trả lời, đối với các phiên bản cũ hơn của Python (2.x), bạn phải sử dụng hàm raw_input:

nb = raw_input('Choose a number: ')

Nếu bạn muốn chuyển đổi nó thành một số, thì bạn nên thử:

number = int(nb)

... mặc dù bạn cần tính đến việc này có thể gây ra ngoại lệ:

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

Và nếu bạn muốn in số bằng định dạng, trong Python 3 str.format()được khuyến nghị:

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

Thay vì:

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

Nhưng cả hai tùy chọn ( str.format()%) đều hoạt động trong cả Python 2.7 và Python 3.


1
luôn đặt spacesau chuỗi của bạn để người dùng nhập dữ liệu vào nếu hòa bình. Enter Tel12340404vs Enter Tel: 12340404. xem! : P
Mehrad

Làm xong. Cám ơn vì sự gợi ý.
Baltasarq

15

Ví dụ không chặn, đa luồng:

Vì việc chặn đầu vào bàn phím (vì các input()khối chức năng) thường không phải là điều chúng tôi muốn làm (chúng tôi thường muốn tiếp tục làm việc khác), đây là một ví dụ đa luồng rất đơn giản để trình bày cách tiếp tục chạy của bạn ứng dụng chính trong khi vẫn đọc trong đầu vào bàn phím bất cứ khi nào họ đến .

Điều này hoạt động bằng cách tạo một luồng để chạy trong nền, liên tục gọi input()và sau đó chuyển bất kỳ dữ liệu nào nó nhận được vào hàng đợi.

Theo cách này, luồng chính của bạn được để làm bất cứ điều gì nó muốn, nhận dữ liệu đầu vào bàn phím từ luồng đầu tiên bất cứ khi nào có thứ gì đó trong hàng đợi.

1. Ví dụ mã Bare Python 3 (không có nhận xét):

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. Cùng mã Python 3 như trên, nhưng với các nhận xét giải thích mở rộng:

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

Đầu ra mẫu:

$ python3 read_keyboard_input.py
Sẵn sàng cho đầu vào bàn phím:
hey
input_str = hey
hello
input_str = hello
7000
input_str = 7000
exit
input_str = exit
Thoát khỏi thiết bị đầu cuối nối tiếp.
Kết thúc.

Người giới thiệu:

  1. https://pyserial.readthedocs.io/en/latest/pyserial_api.html
  2. ***** https://www.tutorialspoint.com/python/python_multithreading.htmlm
  3. ***** https://en.wikibooks.org/wiki/Python_Programming/Threading
  4. Python: Làm thế nào để tôi tạo một lớp con từ một siêu lớp?
  5. https://docs.python.org/3/l Library /queue.html
  6. https://docs.python.org/3.7/l Library / threading.html

Liên quan / Liên kết chéo:

  1. Vòng lặp đọc không chặn PySerial

4

input([prompt])tương đương eval(raw_input(prompt))và có sẵn kể từ python 2.6

Vì nó không an toàn (vì eval), raw_input nên được ưu tiên cho các ứng dụng quan trọng.


1
+1 cho thông tin thú vị đó, mặc dù tôi đánh dấu điều này bởi vì nó thực sự không được liệt kê dưới dạng nhận xét cho câu hỏi hoặc câu trả lời vì nó không thực sự là một câu trả lời.
ArtOfWarfare

3
Nó cũng chỉ áp dụng cho Python 2.x. Trong Python 3.x. raw_inputđã được đổi tên thành inputvà KHÔNG eval.
Jason S

1
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
Eric Stein

@EricStein - Cờ của tôi đã bị từ chối và sau một số phản ánh, tôi đồng ý rằng tôi đã gắn cờ quá vội vàng. Xem điều này: meta.stackexchange.com/questions/225370/ từ
ArtOfWarfare

4

Điều này sẽ làm việc

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

7
Làm thế nào là khác nhau từ các câu trả lời khác gợi ý input()?
David Makogon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.