juntar varios subprocesos

Tengo 5 procesosp1,p2,...,p5 donde quiero escribir algunos datos en stdin de p1, canalizar la salida de p1 a pdin stdin y finalmente leer el resultado final de la salida de p5.

Lo que he probado hasta ahora:

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

El último código cortado simplemente se cuelga, porque debo estar haciendo las operaciones de lectura / escritura incorrectamente.

Podí poner en funcionamiento procesos únicos usandocommunicate() y dos procesos sin sustituir ninguna entrada al primero (ejemplo de documentos de 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]

Pero no puedo entender cómo proporcionar información al primer proceso sin colgar el intérprete.

También podría usar un script bash para eso (que ya he escrito y funciona), pero me gustaría saber cómo lograrlo con Python.

Entonces, me gustaría preguntar, ¿cómo hacer todo eso correctamente, específicamente en qué orden hacer las operaciones de lectura / escritura / cierre en las tuberías?

Estoy trabajando en Linux de 64 bits, si eso importa.

EDIT: Olvidé mencionar que todos los procesos p1, .. p5 consumen todas las entradas que reciben, las procesan, escriben en stdout y luego terminan. Por lo tanto, los siguientes procesos en proceso no deben terminar antes de que los anteriores hayan terminado el procesamiento.

EDIT2: Sé que también podría usar

command = 'bash -c "p1 | p2 | p3 | p4 | p5"'
proc = Popen([command], shell=True)
out, err = proc.communicate(input=indata)
print out

pero mi interés principal es saber cómo encadenar las tuberías únicamente en código python.

Respuestas a la pregunta(1)

Su respuesta a la pregunta