我有两个脚本,它们通过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
的项目。为什么这不会隐式发生?