Comandos síncronos popen subprocess python

Eu estou tentando usar popen para lançar um subprocess que chama dois comandos (com vários argumentos) um após o outro. O segundo comando depende do primeiro comando em execução, então eu esperava usar um único subprocess para executar ambos, em vez de gerar dois processos e esperar no primeiro.

Mas estou tendo problemas porque não sei como dar duas inputs de comando ou separar o comando como um único object.

Além disso, estou tentando evitar a configuração do shell como true, se possível.

Isso é essencialmente o que estou tentando fazer:

for test in resources: command = [ 'pgh', 'resource', 'create', '--name', test['name'], '--description', test['description'], ] command2 = [ 'pgh', 'assignment', 'create', '--name', test['name'], '--user', test['user'], ] p = Popen(command, stdout=PIPE, stderr=PIPE) stdout, stderr = p.communicate() print(stdout) print(stderr) 

Você terá que iniciar o comando e aguardar a conclusão antes de iniciar outro comando. Você deve fazer isso repetidamente para cada comando.

Isso pode ser feito

 ps = [ Popen(c, stdout=PIPE, stderr=PIPE).communicate() for c in command] 

Observe que isso inicia o próximo comando, independentemente do tempo em que o primeiro comando foi bem-sucedido ou falhou. Se você quiser iniciar o próximo comando apenas se o comando anterior suceder, use

 def check_execute(commands): return_code = 0 for c in commands: p = Popen(c, stdout=PIPE, stderr=PIPE) result = p.communicate() yield result return_code = p.returncode if return_code != 0: break 

De acordo com o meu entendimento, o seguinte deve funcionar para você. Encadear a execução uma vez que o anterior conclui o uso.

 p1 = subprocess.Popen(command, stdout=subprocess.PIPE) p2 = subprocess.Popen(command2, stdin=p1.stdout, stdout=subprocess.PIPE) print p2.communicate()