2017-10-07 7 views
0

私はいくつかの値を持つPythonスクリプトを持っています。これは毎秒ターミナルに表示されます。しかし、私のスクリプトは常にユーザーの入力を待つ必要があり、入力に依存してスクリプト内の変数を変更する必要があります。スクリプトで値を印刷する際に、ユーザーの入力を絶えず待つ方法はありますか?

ここでは、毎秒値を印刷するための次のコードがあります。私はこのスクリプトがバックグラウンドでのユーザー入力を絶えず待つようにし、入力に応じて床の値を変更します。

import argparse 
import sys 
import time 

def createParser(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument ('-floor', '--floor') 

    return parser 

parser = createParser() 
namespace = parser.parse_args(sys.argv[1:]) 

def main(): 
    floor = namespace.floor 
    while True: 
    print(floor) 
    time.sleep(1) 
main() 

答えて

1

この状況では、マルチスレッドは必要ありません。最大1秒間入力を待ってから、ユーザーが何かを入力した場合はfloor変数を更新します。このようなものに最適なツールは、selectまたはselectorsモジュールで使用可能なI/O多重化です。例えば

import sys 
import select 
floor = 0.0 
timeout = 1.0 
while True: 
    rlist, wlist, xlist = select.select([sys.stdin], [], [], timeout) 
    if len(rlist): 
     floor = float(sys.stdin.readline().rstrip('\n')) 
     print('New value received.') 
    print(floor) 

しかし、私は、これは快適なユーザーエクスペリエンスではないことを指摘しなければなりません。値は常に出力されます。つまり、ユーザーの入力と出力がコンソールで混合されます。 stdinstdoutは別々のストリームなので、プログラムの実行方法には影響しません。出力が同時に印刷されているので、ユーザーが値を正しく入力するのが難しくなります。

常に印刷する必要がありますか?ユーザーが値を入力するのを待ってから受け取ったときに印刷する方が便利なのでしょうか?この場合、selectモジュールがなくても、sys.stdin.readline()で入力を待つだけです。

関連する問題