2012-03-31 254 views
0

我嘗試使用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

回答

2

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

相關問題