วิธีอ่านการป้อนข้อมูลด้วยแป้นพิมพ์


123

ฉันต้องการอ่านข้อมูลจากแป้นพิมพ์ใน python

ฉันลองสิ่งนี้:

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

แต่มันไม่ได้ผลไม่ว่าจะเป็นคราสหรือในเทอร์มินัลมันจะหยุดคำถามเสมอ ฉันพิมพ์ตัวเลขได้ แต่ไม่มีอะไรเกิดขึ้น

คุณรู้ไหมว่าทำไม?


12
ฉันค่อนข้างแน่ใจว่า OP ลืมกด Return หลังจากป้อนตัวเลขและไม่มีคำตอบใดที่ตอบคำถามได้จริง
Aran-Fey

คำตอบ:


127

ลอง

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

และหากคุณต้องการมีค่าตัวเลขเพียงแค่แปลง:

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

2
เวอร์ชันมัลติเธรดที่ไม่ปิดกั้นดังนั้นคุณสามารถทำสิ่งต่างๆได้ต่อไปแทนที่จะบล็อกการป้อนข้อมูลด้วยแป้นพิมพ์: stackoverflow.com/a/53344690/4561887
Gabriel Staples

84

ดูเหมือนว่าคุณกำลังผสม Pythons ต่างกันที่นี่ (Python 2.x เทียบกับ Python 3.x) ... โดยพื้นฐานแล้วถูกต้อง:

nb = input('Choose a number: ')

ปัญหาคือรองรับเฉพาะใน Python 3 ตามที่ @sharpner ตอบไว้สำหรับ Python (2.x) เวอร์ชันเก่าคุณต้องใช้ฟังก์ชันraw_input:

nb = raw_input('Choose a number: ')

หากคุณต้องการแปลงเป็นตัวเลขคุณควรลอง:

number = int(nb)

... แม้ว่าคุณจะต้องคำนึงว่าสิ่งนี้อาจทำให้เกิดข้อยกเว้นได้:

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

และหากคุณต้องการพิมพ์ตัวเลขโดยใช้การจัดรูปแบบstr.format()ขอแนะนำใน Python 3 :

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

แทน:

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

แต่ทั้งสองตัวเลือก ( str.format()และ%) ทำงานได้ทั้งใน Python 2.7 และ Python 3


1
ใส่spaceหลังสตริงของคุณเสมอเพื่อให้ผู้ใช้ป้อนข้อมูลของเขาหากสงบ Enter Tel12340404เทียบกับEnter Tel: 12340404. ดู! : P
Mehrad

เสร็จสิ้น ขอบคุณสำหรับคำแนะนำ
Baltasarq

15

ตัวอย่างแบบมัลติเธรดที่ไม่ปิดกั้น:

เนื่องจากการบล็อกการป้อนข้อมูลด้วยแป้นพิมพ์ (เนื่องจากinput()บล็อกฟังก์ชัน) มักไม่ใช่สิ่งที่เราต้องการทำ (เรามักต้องการทำสิ่งอื่น ๆ ต่อไป) ต่อไปนี้เป็นตัวอย่างแบบมัลติเธรดที่ถูกถอดออกเพื่อสาธิตวิธีการทำงานของคุณ แอปพลิเคชันหลักในขณะที่ยังคงอ่านในอินพุตแป้นพิมพ์ทุกครั้งที่มาถึงโปรแกรมหลักขณะที่ยังคงการอ่านในปัจจัยการผลิตแป้นพิมพ์เมื่อใดก็ตามที่พวกเขามาถึง

วิธีนี้ทำงานโดยการสร้างเธรดหนึ่งเธรดเพื่อทำงานในพื้นหลังเรียกอย่างต่อเนื่อง input()นั้นส่งข้อมูลใด ๆ ที่ได้รับไปยังคิว

ด้วยวิธีนี้เธรดหลักของคุณจะถูกปล่อยให้ทำทุกอย่างที่ต้องการโดยรับข้อมูลอินพุตแป้นพิมพ์จากเธรดแรกเมื่อใดก็ตามที่มีบางสิ่งอยู่ในคิว

1. ตัวอย่างโค้ด Bare Python 3 (ไม่มีความคิดเห็น):

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. รหัส Python 3 เหมือนกันกับข้างบน แต่มีความคิดเห็นอธิบายอย่างละเอียด:

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

ตัวอย่างผลลัพธ์:

$ python3 read_keyboard_input.py
พร้อมสำหรับการป้อนข้อมูลด้วยแป้นพิมพ์:
hey
input_str = เฮ้
สวัสดี
input_str = สวัสดี
7000
input_str = 7000
exit
input_str = exit
ออกจากเทอร์มินัลอนุกรม
ปลาย

อ้างอิง:

  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: ฉันจะสร้างคลาสย่อยจากซูเปอร์คลาสได้อย่างไร
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

ที่เกี่ยวข้อง / cross-linked:

  1. ลูปการอ่านแบบไม่ปิดกั้น PySerial

4

input([prompt])เทียบเท่าeval(raw_input(prompt))และพร้อมใช้งานตั้งแต่ python 2.6

เนื่องจากไม่ปลอดภัย (เนื่องจาก eval) ควรเลือก raw_input สำหรับแอปพลิเคชันที่สำคัญ


1
+1 สำหรับข้อมูลเล็กน้อยที่น่าสนใจแม้ว่าฉันจะตั้งค่าสถานะนี้เนื่องจากเป็นเรื่องจริงที่จะแสดงเป็นความคิดเห็นเกี่ยวกับคำถามหรือคำตอบเนื่องจากไม่ใช่คำตอบในตัวของมันเอง
ArtOfWarfare

3
นอกจากนี้ยังใช้ได้กับ Python 2.x เท่านั้น ใน Python 3.x. raw_inputถูกเปลี่ยนชื่อเป็นinputและไม่ประเมิน
Jason S

1
สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้เขียนโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
Eric Stein

@EricStein - ธงของฉันถูกปฏิเสธและหลังจากการไตร่ตรองฉันยอมรับว่าฉันตั้งค่าสถานะอย่างเร่งรีบเกินไป ดูสิ่งนี้: meta.stackexchange.com/questions/225370/…
ArtOfWarfare

4

สิ่งนี้ควรใช้งานได้

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

7
สิ่งนี้แตกต่างจากคำตอบอื่น ๆ ที่แนะนำinput()อย่างไร
David Makogon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.