2012-03-31 5 views
0

Ich versuche, Python (2.6) Subprozess-Modul zwischen zwei externen Programmen zu kommunizieren. Als ich anfing, mehr Daten zu pumpen, hörte 'Client' auf, alles zu empfangen. Ich dachte, es könnte mit der begrenzten Größe des subprocess.PIPE-Objekts (http://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/) zusammenhängen. Also entschied ich mich, fifo zu versuchen, aber es hat nicht wie erwartet funktioniert. Wie soll ich fifo verwenden, um zwischen zwei externen Programmen zu kommunizieren, die aus dem Python-Skript heraus aufgerufen werden. Derzeit ist mein Skript hält an (für ein anderes Ende Fifo warten):Wie verwende ich FIFO zur Kommunikation zwischen Python-Subprozessen

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

Würden Sie in der Lage sein, ein einfaches Beispiel zu schreiben, die wir testen und festzustellen, was falsch sein könnte? – jdi

Antwort

2

ich nicht mkfifo Arbeit zu bekommen habe es geschafft. Allerdings gelang es mir, Server/Client kommunizieren über os.pipe haben:

#!/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

Sie sollten Ihre andere Antwort löschen. Es verrechnet Ihre Punkte auf diesem. – jdi