2017-10-07 17 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

在這種情況下,您不需要多線程。您希望等待輸入達一秒鐘,然後在用戶輸入任何內容時更新floor變量。這種類似的最佳工具是selectselectors模塊中提供的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()的輸入即可。