迭代标准输入流直到读取到EOF的块。

3

我有两个脚本,它们通过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个回答

2
根据python -h帮助信息: -u 强制使标准输入、标准输出和标准错误完全无缓冲。在需要的系统上,还将标准输入、标准输出和标准错误设置为二进制模式。请注意,xreadlines()、readlines()和文件对象迭代器(“for line in sys.stdin”)中存在内部缓冲区,不受此选项的影响。要解决这个问题,您需要在“while 1:”循环内使用“sys.stdin.readline()”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接