Python:如何在不等待的情况下判断输入文件是否有输入挂起

时间:2012-06-13 22:04:59

标签: python python-2.7

通常,您使用循环在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

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

2 个答案:

答案 0 :(得分:0)

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

import select

rlist, wlist, elist = select.select([sys.stdin], [], [])
if rlist:
    s = raw_input()
else:
    pass # no input ready right now

答案 1 :(得分:0)

好的,here's something在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)

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

更新:Grmph。这取决于select。我不喜欢Windows。