如何使用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')) 
+0

你能发布一个简单的例子,我们可以测试并确定什么可能是不正确的吗? – jdi 2012-03-31 01:28:55

我没得到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