pipando vários subprocessos
Tenho 5 processosp1,p2,...,p5
onde eu quero escrever alguns dados para stdin de p1, canalizar a saída p1 para p2 stdin e finalmente ler o resultado final da saída de p
O que eu tentei até agora:
p1 = Popen(['p1'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['p2'], stdin=p1.stdout, stdout=PIPE)
...
p5 = Popen(['p5'], stdin=p4.stdout, stdout=PIPE)
# write data to stdin
p1.stdin.write(indata)
p1.stdin.close()
# not sure in what order to close the pipes here, if at all
# read output
out = p5.stdout.read()
print out
O último código cortado simplesmente trava, porque devo estar executando as operações de leitura / gravação incorretament
Consegui trabalhar processos únicos usandocommunicate()
e dois processos sem fornecer nenhuma entrada à primeira (exemplo dos documentos do Python):
output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
Mas não consigo descobrir como fornecer entrada para o primeiro processo sem desligar o intérpret
Eu também poderia usar um script bash para isso (que eu já escrevi e funciona), mas eu gostaria de saber como obter o mesmo com o Pytho
ntão, eu gostaria de perguntar, como fazer tudo isso corretamente, especificamente em que ordem executar as operações de leitura / gravação / fechamento em tubo
Estou trabalhando no Linux de 64 bits, se isso import
EDIT: esqueci de mencionar que todos os processos p1, .. p5 consomem toda a entrada que recebem, processam, escrevem para stdout e terminam. Portanto, os processos a seguir no pipeline não devem terminar antes que os anteriores concluam o processament
EDIT2: Eu sei que eu também poderia usar
command = 'bash -c "p1 | p2 | p3 | p4 | p5"'
proc = Popen([command], shell=True)
out, err = proc.communicate(input=indata)
print out
mas meu principal interesse é saber como encadear os tubos puramente no código pytho