迭代标准块直到读取EOF

时间:2015-07-29 09:28:36

标签: python python-2.7 unix io stream

我有两个通过Unix管道连接的脚本。第一个脚本将字符串写入标准输出,并由第二个脚本使用。

考虑以下

# producer.py
import sys
import time
for x in range(10):
    sys.stdout.write("thing number %d\n"%x)
    sys.stdout.flush()
    time.sleep(1)

# consumer.py
import sys
for line in sys.stdin:
    print line

现在,当我运行:python producer.py | python consumer.py时,我希望每秒看到一个新的输出行。相反,我等了10秒,我突然看到所有的输出。

为什么我不能一次迭代stdin一件物品?为什么我必须等到producer在循环体开始执行之前给我一个EOF

请注意,如果我将consumer.py更改为:

,我可以找到正确的行为
# consumer.py
import sys    
def stream_stdin():
    line = sys.stdin.readline()
    while line:
        yield line
        line = sys.stdin.readline()

for line in stream_stdin():
    print line

我想知道为什么我必须显式构建一个生成器来流式传输stdin的项目。为什么不隐含这种情况呢?

1 个答案:

答案 0 :(得分:2)

根据python -h帮助信息:

  

-u 强制stdin,stdout和stderr完全无缓冲。在重要的系统上,还将stdin,stdout和stderr放入   二进制模式。请注意,xread中有内部缓冲 -   lines(),readlines()和file-object迭代器(“for line in   sys.stdin“)不受此选项的影响。工作   围绕这个,你会想要在里面使用“sys.stdin.readline()”   一个“while 1:”循环。