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

questionAnswers(1)

yourAnswerToTheQuestion