Python - 从管道中简单读取行

15

我正在尝试从管道中读取行并进行处理,但我做了一些傻事,无法弄清楚具体是什么。生成器将会不断地产生行,就像这样:

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 shell中使用python producer.py | python consumer.py运行此代码时,它会一直休眠(好像永远也不会收到数据?)看起来问题可能是生产者从未终止,因为如果我发送有限数量的数据,则正常工作。

如何使消费者接收并显示数据?在实际应用中,生产者是一个我无法控制的C++程序。

2个回答

15

一些旧版本的Windows通过文件模拟管道(因此容易出现问题),但这在10多年来已经不再是问题。试试添加一个

  sys.stdout.flush()

print之后向生产者发送消息,同时尝试使生产者的标准输出不缓冲(使用python -u命令)。

当然,如果您无法控制生产者——如果它缓冲了太多输出,您仍然会等待很长时间。

不幸的是,在类Unix操作系统上有许多解决该问题的方法,例如pyexpect,pexpectexscriptparamiko,但我怀疑它们中的任何一个都可以在Windows上运行;如果确实是这种情况,我建议尝试Cygwin,它在Windows上提供了足够的Linux外观,从而经常可以在Windows上使用类Linux的方法。


7

这是关于Python默认使用缓冲区的I/O的内容。在解释器中传递-u选项以禁用此行为:

python -u producer.py | python consumer.py

这对我解决了问题。


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