如何在脚本中打印值时不断等待用户输入?
问题描述:
我有一个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()
答
在这种情况下,您不需要多线程。您希望等待输入达一秒钟,然后在用户输入任何内容时更新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)
但我要指出,这不是一个愉快的用户体验。值一直在打印,这意味着用户的输入和输出在控制台中混合在一起。这不会影响程序的运行方式,因为stdin
和stdout
是独立的流。由于输出正在同时打印,因此用户难以正确输入值。
您确定需要不断打印吗?只需等待用户输入一个值,然后在收到时打印该值就可能更有用。在这种情况下,您甚至不需要select
模块,只需等待sys.stdin.readline()
的输入即可。