2014-04-11

Pipeando procesos en python

A veces uno quiere correr varios procesos en python y enchufar el standard output de un proceso con el stdin del siguiente. Esto sería equivalente a hacer en el shell:
$ prog1 param1 | prog2 param21 param22 | prog3

Para poder hacer algo así en python hice este método:
import subprocess
def pipe(*args):
    last_proc = None
    for command in args:
        in_file = last_proc.stdout if last_proc else tempfile.TemporaryFile()
        proc = subprocess.Popen(command, stdin=in_file, stdout=subprocess.PIPE)
        if last_proc:
            last_proc.stdout.close()
        last_proc = proc
        

    last_proc.communicate()

Para hacer lo mismo que el comando de arriba hay que hacer:
pipe(
  ("prog1", "param1"),
  ("prog2", "param21", "param22"),
  ("prog3",)
)

La única limitación es que no puedo procesar la salida de standard output del último proceso. 

Happy hacking,
Aureliano.

No hay comentarios.: