2017-10-07 91 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()的输入即可。