2016-12-07 3 views
1

Mein Verständnis ist, dass subprocess.Popen ein asynchroner Aufruf ist und Anhängen .wait(), um den Anruf wird es synchron machen. Wird der zweite dieser Popen-Aufrufe ausgeführt, nachdem der erste Anruf abgeschlossen wurde?Legendes Python subprocess popen asynchrone

proc1 = subprocess.Popen(first_command, stdout=subprocess.PIPE, shell=True) 
proc2 = subprocess.Popen(second_command, stdin=proc1.stdout, stdout=self.fw, shell=True) 

Ich versuche, zu bestimmen, wann es notwendig ist, warten() zu verwenden, und warum es Fehler verursacht, wenn in dem obigen Beispiel popen Anweisungen verwendet, zum Beispiel:

proc1 = subprocess.Popen(first_command, stdout=subprocess.PIPE, shell=True).wait() # throws exception 
proc2 = subprocess.Popen(second_command, stdin=proc1.stdout, stdout=self.fw, shell=True).wait() # seems ok 

Antwort

1

Nach viel Versuch und Fehler und erneutes Lesen anderer Beiträge und der Dokumente, das ist, was funktioniert.

proc1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE, shell=True) 
# don't put wait here because of potential deadlock if stdout buffer gets full and we're waiting for proc2 to consume buffer then we're deadlocked 
proc2 = subprocess.Popen(cmd2, stdin=proc1.stdout, stdout=self.fw, shell=True) 
# ok to wait here 
proc2.wait() 
# ok to test return code after proc2 completes 
if proc2.returncode != 0: 
    print('Error spawning cmd2') 
else: 
    print('Success spawning cmd2') 

Hoffentlich wird dies jemand anderen helfen.