キーボード入力の読み方は?


123

Pythonでキーボードからデータを読みたい

私はこれを試します:

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

しかし、Eclipseでもターミナルでも機能せず、常に問題を解決できません。数字を入力することはできますが、何も起こらなくなりました。

なぜなのかご存知ですか?


12
OPが数値を入力した後でReturnキーを押すのを忘れたのは確かです。どの回答も実際には質問に回答しません。
Aran-Fey 2018

回答:


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を混ぜているようです(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 2014年

15

非ブロッキング、マルチスレッドの例:

キーボード入力のinput()ブロック(機能ブロックのため)は、私たちがやりたいことではないことが多いので(他のことを続けたいと思っています)、実行を継続する方法を示す、非常に簡略化されたマルチスレッドの例次に示します彼らが到着するたびにキーボード入力を読みながらメインアプリケーション

これは、バックグラウンドで実行する1つのスレッドを作成し、継続的に呼び出して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
キーボード入力の準備ができました:
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))であり、Python 2.6以降で使用可能

(evalのため)安全ではないため、重要なアプリケーションにはraw_inputを使用することをお勧めします。


1
興味深い情報を1つ追加します。ただし、実際には回答そのものではないため、質問または回答へのコメントとして記載することを意図しているため、フラグを立てています。
ArtOfWarfare 14

3
また、Python 2.xにのみ適用されます。Python 3.xの場合。raw_inputに名前が変更されinput、評価されません。
Jason S 14

1
これは質問に対する答えを提供しません。批評したり、著者に説明を要求するには、投稿の下にコメントを残してください。
エリックスタイン

@EricStein-私のフラグは拒否されました、そしていくつかの反省の後、私はあまりにも急いでフラグを立てたことに同意します。:この参照meta.stackexchange.com/questions/225370/...
ArtOfWarfare

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.