我有两个通过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
的项目。为什么不隐含这种情况呢?
答案 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:”循环。