我试着从管道中读出并处理它们,但我做了一些愚蠢的事情,我不知道该怎么做。生产商将无限期地保持生产线,如下所示:
生产者.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++程序,我没有控制。
这是关于Python默认情况下缓冲的I/O。将
-u
选项传递给解释器以禁用此行为:它帮我解决了这个问题。
一些旧版本的Windows模拟了通过文件的管道(所以它们很容易出现这样的问题),但这已经10多年没有问题了。尝试添加
在
print
之后发送给生产者,并尝试使生产者的stdout没有缓冲(通过使用python -u
)。当然,如果你无法控制生产商,这也无济于事——如果生产商缓冲了太多的产出,你还会等很长时间。
不幸的是,虽然在类Unix的操作系统上有很多方法可以解决这个问题,比如pyexpect,pexpect,exscript,和paramiko,但我怀疑它们中的任何一个在Windows上都能工作;如果真是这样,我会尝试Cygwin,它在Windows上放置了足够多的类似Linux的贴面,以便经常在Windows框上使用类似Linux的方法。
相关问题 更多 >
编程相关推荐