2016-12-07 5 views
1

Я понимаю, что subprocess.popen - это асинхронный вызов и добавление .wait() к вызову сделает его синхронным. Будет ли второй из этих всплывающих вызовов выполнить после завершения первого вызова?Понимание python subprocess popen asynchronous

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

Я пытаюсь определить, когда необходимо использовать ожидание() и почему это приводит к ошибкам при использовании в приведенном выше примере POPEN заявления, например:

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 

ответ

1

После большого количества проб и ошибки и повторного чтения других сообщений и документов, это то, что работает.

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') 

Надеюсь, это поможет кому-то еще.