Python-从pip读取简单的行

2024-03-29 08:17:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着从管道中读出并处理它们,但我做了一些愚蠢的事情,我不知道该怎么做。生产商将无限期地保持生产线,如下所示:

生产者.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中以python producer.py | python consumer.py的形式运行它时,它只会永远休眠(似乎永远不会获取数据?)似乎问题在于生产者永远不会终止,因为如果我发送有限的数据,那么它就可以正常工作。

如何获取要接收的数据并显示给消费者?在实际应用中,制作者是一个C++程序,我没有控制。


Tags: 数据pyimporttrue管道timesysline
2条回答

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

python -u producer.py | python consumer.py

它帮我解决了这个问题。

一些旧版本的Windows模拟了通过文件的管道(所以它们很容易出现这样的问题),但这已经10多年没有问题了。尝试添加

  sys.stdout.flush()

print之后发送给生产者,并尝试使生产者的stdout没有缓冲(通过使用python -u)。

当然,如果你无法控制生产商,这也无济于事——如果生产商缓冲了太多的产出,你还会等很长时间。

不幸的是,虽然在类Unix的操作系统上有很多方法可以解决这个问题,比如pyexpect,pexpectexscript,和paramiko,但我怀疑它们中的任何一个在Windows上都能工作;如果真是这样,我会尝试Cygwin,它在Windows上放置了足够多的类似Linux的贴面,以便经常在Windows框上使用类似Linux的方法。

相关问题 更多 >