2012-03-31 17 views
0

2つの外部プログラム間で通信するためにPython(2.6)サブプロセスモジュールを使用しようとしています。私がより多くのデータをポンピングし始めたとき、「クライアント」はすべてを受け取った。私はそれがサブプロセスの限られたサイズに関連するかもしれないと思った.PIPEオブジェクト(http://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/)。だから私はfifoを試してみることにしましたが、期待どおりに動かなかったのです。 Pythonスクリプトから呼び出される2つの外部プログラムの間で通信するためにfifoをどのように使うべきですか?現在、私のスクリプトは、(FIFOの別の終わりを待っている)で停止:Pythonサブプロセス間でFIFOを共有する方法

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

答えて

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

関連する問題