Как читать ввод с клавиатуры?

123

Я хочу читать данные с клавиатуры на python

Я пробую это:

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

Но это не работает, ни с eclipse, ни в терминале, это всегда вопрос остановки. Я могу набрать номер, но ничего не происходит.

Ты знаешь почему?

Tränen
источник
12
Я почти уверен, что OP просто забыл нажать 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"
sharpner
источник
2
Неблокирующая многопоточная версия, так что вы можете продолжать делать что-то вместо блокировки ввода с клавиатуры: stackoverflow.com/a/53344690/4561887
Gabriel Staples
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.

Baltasarq
источник
1
всегда ставьте spaceпосле строки, чтобы пользователь мог ввести свой ввод, если мир. Enter Tel12340404против Enter Tel: 12340404. видеть! : P
Mehrad
Готово. Спасибо за предложение.
Baltasarq
15

Неблокирующий, многопоточный пример:

Поскольку блокировка ввода с клавиатуры (поскольку input()функциональные блоки) часто не то, что мы хотим делать (мы часто хотели бы продолжать делать другие вещи), вот очень урезанный многопоточный пример, чтобы продемонстрировать, как продолжать работу вашего основное приложение, продолжая читать ввод с клавиатуры всякий раз, когда они поступают .

Это работает путем создания одного потока для работы в фоновом режиме, постоянно вызывающего input() и передачи любых данных, которые он получает, в очередь.

Таким образом, вашему основному потоку остается делать все, что он хочет, получая данные ввода с клавиатуры из первого потока всякий раз, когда что-то есть в очереди.

1. Пример кода на голом 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
Готов к вводу с клавиатуры:
эй
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 следует использовать для критически важных приложений.

jeanM
источник
1
+1 за этот интересный лакомый кусочек информации, хотя я отмечаю это, потому что это действительно должно быть указано как комментарий к вопросу или ответу, потому что это не совсем сам по себе ответ.
ArtOfWarfare
3
Это также применимо только к Python 2.x. В Python 3.x. raw_inputбыл переименован в inputи НЕ eval.
Джейсон С.
1
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под его сообщением.
Эрик Штайн
@EricStein - Мой флаг был отклонен, и после некоторого размышления я согласен, что пометил слишком поспешно. Посмотри это: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
4

Это должно работать

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)
Antoine
источник
7
Чем это отличается от других предлагаемых ответов input()?
Дэвид Макогон