키보드 입력을 읽는 방법?


123

파이썬 키보드에서 데이터를 읽고 싶습니다.

나는 이것을 시도한다 :

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

여기에서 다른 Python을 혼합하는 것 같습니다 (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 Tel12340404Enter Tel: 12340404. 보다! : P
Mehrad 2014 년

끝난. 제안 해 주셔서 감사합니다.
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 = hey
hello
input_str = hello
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

관련 / 교차 연결 :

  1. PySerial 비 차단 읽기 루프

4

input([prompt]) 다음과 같다 eval(raw_input(prompt))파이썬 2.6과 하고 사용 가능합니다.

안전하지 않기 때문에 (eval 때문에) raw_input은 중요한 애플리케이션에 선호되어야합니다.


1
흥미로운 정보에 대해 +1. 질문이나 답변에 대한 의견으로 표시 될 것이기 때문에 플래그를 지정하고 있지만 실제로는 그 자체가 답변이 아니기 때문입니다.
ArtOfWarfare 2014 년

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.