Python中select()之间的键盘输入

时间:2012-12-05 13:57:06

标签: python select stdin readline keyboard-input

我写了一些代码来获取键盘的输入,并检查是否有效:

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。

1 个答案:

答案 0 :(得分:2)

由于is_alive()中的代码调用了ssh,这将耗尽标准输入。

尝试使用ssh选项或重定向-n启动stdin

后者适用于

sp = subprocess.Popen(..., stdin=subprocess.PIPE)
sp.stdin.close()