Python - 从管道中简单读取行
我正在尝试从一个管道中读取数据行并处理它们,但我好像做了一些傻事,搞不清楚问题出在哪里。生产者会不断地生成数据行,像这样:
producer.py
import time
while True:
print 'Data'
time.sleep(1)
消费者只需要定期检查是否有新行:
consumer.py
import sys, time
while True:
line = sys.stdin.readline()
if line:
print 'Got data:', line
else:
time.sleep(1)
当我在Windows命令行中运行 python producer.py | python consumer.py
时,它似乎一直在等待(好像从来没有数据?)看起来问题可能是因为生产者从不结束,如果我发送有限的数据,那就能正常工作。
我该如何让消费者接收到数据并显示出来呢?在实际应用中,生产者是一个我无法控制的C++程序。
2 个回答
7
这段话是关于Python默认情况下会对输入输出进行缓冲的。如果你想关闭这种缓冲,可以在运行程序时给解释器加上-u
这个选项:
python -u producer.py | python consumer.py
这样做解决了我的问题。
15
一些旧版的Windows通过文件来模拟管道(所以容易出现这样的问题),但在过去10多年里这已经不是问题了。你可以尝试在生产者的print
之后加一个
sys.stdout.flush()
,同时也可以试着让生产者的标准输出不进行缓存(可以使用python -u
来实现)。
当然,如果你无法控制生产者的话,这样做也没用——如果它缓存了太多输出,你还是得等很久。
不幸的是,虽然在类Unix操作系统上有很多解决这个问题的方法,比如pyexpect、pexpect、exscript和paramiko,但我怀疑这些在Windows上都不管用;如果真是这样,我建议你试试Cygwin,它能在Windows上提供类似Linux的环境,通常可以让你用Linux的方法在Windows上工作。