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.