15

我正在尝试从管道中读取行并对其进行处理,但我正在做一些愚蠢的事情,我不知道是什么。生产者将无限期地继续生产线,如下所示:

生产者.py

import time

while True:
    print 'Data'
    time.sleep(1)

消费者只需要定期检查线路:

消费者.py

import sys, time
while True:
    line = sys.stdin.readline()
    if line:
        print 'Got data:', line
    else:
        time.sleep(1)

当我在 Windows shell as 中运行它时python producer.py | python consumer.py,它只是永远休眠(似乎从不获取数据?)似乎问题在于生产者永远不会终止,因为如果我发送有限数量的数据,那么它就可以正常工作。

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

4

2 回答 2

15

一些旧版本的 Windows 通过文件模拟管道(因此它们很容易出现此类问题),但这在 10 多年内一直没有问题。尝试添加一个

  sys.stdout.flush()

之后发送给生产者print,并尝试使生产者的标准输出无缓冲(通过使用python -u)。

当然,如果您无法控制生产者,这将无济于事——如果它缓冲了太多的输出,您仍然要等待很长时间。

不幸的是——虽然有很多方法可以在类 Unix 操作系统上解决这个问题,例如 pyexpect、pexpectexscriptparamiko,但我怀疑它们中的任何一个都适用于 Windows;如果确实如此,我会尝试Cygwin,它在 Windows 上放置了足够的类似 Linux 的单板,以便经常在 Windows 机器上使用类似 Linux 的方法。

于 2009-06-08T14:42:52.257 回答
7

这是关于默认情况下使用 Python 缓冲的 I/O。将选项传递-u给解释器以禁用此行为:

python -u producer.py | python consumer.py

它为我解决了这个问题。

于 2009-06-08T14:47:28.847 回答