Python - 从管道中简单读取行

15 投票
2 回答
17268 浏览
提问于 2025-04-15 12:06

我正在尝试从一个管道中读取数据行并处理它们,但我好像做了一些傻事,搞不清楚问题出在哪里。生产者会不断地生成数据行,像这样:

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、pexpectexscriptparamiko,但我怀疑这些在Windows上都不管用;如果真是这样,我建议你试试Cygwin,它能在Windows上提供类似Linux的环境,通常可以让你用Linux的方法在Windows上工作。

撰写回答