1

通常,您在 Python 中使用如下循环逐行处理文件:

import sys
for s in sys.stdin:
    # do something with the line in s

或者

import sys
while True:
    line = sys,stdin.readline()
    if len(line) == 0: break
    # process input line

当然,你也可以像这样使用 raw_input():

try:
    while True:
        s = raw_input()
        # process input line
except EOFError:
    # there's EOF.

当然,在所有这些情况下,如果没有准备好读取的输入,则底层read()操作会暂停等待 I/O。

我想要做的是查看是否有输入挂起而不暂停,所以我可以阅读直到输入用尽,然后去做其他事情。也就是说,我希望能够做类似的事情

while "there is input pending":
    #get the input

但是当没有更多的输入待处理时,打破循环。

4

2 回答 2

1

如果您使用的是 Unix 的某些变体,并且您的标准输入是管道而不是文件,则可以使用该select模块检查是否有等待输入。至少,代码可能如下所示:

import select

rlist, wlist, elist = select.select([sys.stdin], [], [])
if rlist:
    s = raw_input()
else:
    pass # no input ready right now
于 2012-06-13T22:07:00.560 回答
1

好的,这是在 UNIX 上运行良好的东西

import sys
import select
import tty
import termios


def isData():
    return select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], [])

old_settings = termios.tcgetattr(sys.stdin)
try:
    tty.setcbreak(sys.stdin.fileno())

    i = 0
    while 1:
        print i
        i += 1

        if isData():
            c = sys.stdin.read(1)
            if c == '\x1b':         # x1b is ESC
                break

finally:
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)

当我有机会制作一个更好的测试程序时,我会修改/扩展这个答案。我(到目前为止)不清楚在 Windows 上的运行情况ttytermios工作情况。

更新:Grmph。这取决于select. 我不喜欢 Windows 是有原因的。

于 2012-06-13T22:32:00.580 回答