我写了一些代码来获取键盘的输入,并检查是否有效:
import sys
from select import select
timeout = 10
while is_alive(): # is_alive is a method to check some stuffs, might take 5 secs
rlist, _, _ = select([sys.stdin], [], [], timeout)
if rlist:
s = sys.stdin.readline()
print repr(s)
handle(s) # handle is a method to handle and react according to input s
我发现当键盘输入在等待select()
之外结束时(通常在is_alive()
的5秒内结束),if rlist:
将变为假。
我能理解为什么,但我不知道如何解决它。
还有另一个与上述情况相关的问题,当有些输入位于不同的readline()
等待时,有时select()
会返回输入的最后一行。
这意味着,如果我输入'abc \ n',不幸的是'\ n'位于select()
之外(这意味着,我按 Enter ,程序正在执行其他部分,例如is_alive()
),然后如果我输入'def \ n'这次 Enter 成功点击select()
,我会看到来自s
的{{1}}变为 'def \ n',第一行消失了。
解决上述两个问题有什么好的解决方案吗?我正在使用FreeBSD 9.0。
答案 0 :(得分:2)
由于is_alive()
中的代码调用了ssh
,这将耗尽标准输入。
尝试使用ssh
选项或重定向-n
启动stdin
。
后者适用于
sp = subprocess.Popen(..., stdin=subprocess.PIPE)
sp.stdin.close()