【问题标题】:Python - simple reading lines from a pipePython - 从管道中简单读取行
【发布时间】:2009-06-08 14:38:32
【问题描述】:

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

生产者.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++ 程序。

【问题讨论】:

    标签: python pipe producer-consumer


    【解决方案1】:

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

      sys.stdout.flush()
    

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

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

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

    【讨论】:

      【解决方案2】:

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

      python -u producer.py | python consumer.py
      

      它为我解决了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2021-03-28
        相关资源
        最近更新 更多