如何使用FIFO在python子进程之间进行通信
问题描述:
我尝试使用Python(2.6)子进程模块在两个外部程序之间进行通信。当我开始抽取更多数据时,“客户端”停止接收所有内容。我认为这可能与子程序的大小有关.PIPE对象(http://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/)。所以我决定尝试fifo,但它没有按预期工作。我应该如何使用fifo在从python脚本调用的两个外部程序之间进行通信。目前我的脚本停止在(等待FIFO的另一端):如何使用FIFO在python子进程之间进行通信
pipe_name = "stream-%s.fifo"%self.transponder
os.mkfifo(pipe_name)
self.stream = Popen(program1, stdout=open(pipe_name,'w'),
stderr=open("test.log",'w'))
答
我没得到mkfifo
工作。不过,我设法通过服务器/客户端通过os.pipe
进行通信:
#!/usr/bin/env python
from subprocess import Popen
import os
from itertools import cycle
from time import sleep
from sys import stdout, executable
def client():
for letter in cycle('ABCDE'):
stdout.write(letter)
stdout.flush()
sleep(1)
def main(argv=None):
import sys
from argparse import ArgumentParser
argv = argv or sys.argv
parser = ArgumentParser()
parser.add_argument('--client', default=False, action='store_true')
args = parser.parse_args(argv[1:])
if args.client:
client()
r, w = os.pipe()
pipe = Popen([executable, __file__, '--client'], stdout=os.fdopen(w, 'w'))
try:
client_out = os.fdopen(r, 'r')
while True:
letter = client_out.read(1)
print(letter)
except KeyboardInterrupt:
pipe.kill()
if __name__ == '__main__':
main()
+0
你应该删除你的其他答案。它抵消了你的观点。 – jdi 2012-03-31 18:10:42
你能发布一个简单的例子,我们可以测试并确定什么可能是不正确的吗? – jdi 2012-03-31 01:28:55