Як читати введення з клавіатури?


123

Я хотів би прочитати дані з клавіатури в python

Я пробую це:

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

Але це не працює, ні з затемненням, ні в терміналі, це завжди зупинка питання. Я можу набрати номер, але після цього нічого не станеться.

Ти знаєш чому?


12
Я впевнений, що ОП просто забув натиснути Return після введення номера, і жодна з відповідей насправді не відповідає на питання.
Аран-Фей

Відповіді:


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
Габріель Штаплес

84

Здається, ви тут змішуєте різні пітони (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")

А якщо ви хочете роздрукувати номер за допомогою форматування, в Python 3 str.format()рекомендується:

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
Мехрад

Зроблено. Дякую за пропозицію.
Балтасарк

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 = hey
привіт
input_str = привіт
7000
input_str = 7000
вихід
input_str = вихід
Вихід із серійного терміналу.
Кінець.

Список літератури:

  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

Пов'язані / перехресно пов'язані:

  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
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією.
Ерік Штейн

@EricStein - Мій прапор було відхилено, і після деяких роздумів я погоджуюся, що я поставив прапор занадто поспішно. Дивіться це: meta.stackexchange.com/questions/225370/…
ArtOfWarfare

4

Це має спрацювати

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

7
Чим це відрізняється від інших відповідей, що підказують input()?
Девід Макогон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.