Estoy intentando usar el módulo subprocess
en Python para comunicarme con un proceso que lee entradas estándar y escribe salidas estándar de forma continua. Quiero tener las líneas de lectura del subproceso de un iterador que produce la entrada, y luego leer las líneas de salida del subproceso. Es posible que no haya una correspondencia uno a uno entre las líneas de entrada y salida. ¿Cómo puedo alimentar un subproceso desde un iterador arbitrario que devuelve cadenas?¿Cómo puedo alimentar la entrada estándar de un subproceso desde un iterador de Python?
Aquí hay un código de ejemplo que da un caso de prueba simple, y algunos métodos que he probado que no funciona por alguna razón u otra:
#!/usr/bin/python
from subprocess import *
# A really big iterator
input_iterator = ("hello %s\n" % x for x in xrange(100000000))
# I thought that stdin could be any iterable, but it actually wants a
# filehandle, so this fails with an error.
subproc = Popen("cat", stdin=input_iterator, stdout=PIPE)
# This works, but it first sends *all* the input at once, then returns
# *all* the output as a string, rather than giving me an iterator over
# the output. This uses up all my memory, because the input is several
# hundred million lines.
subproc = Popen("cat", stdin=PIPE, stdout=PIPE)
output, error = subproc.communicate("".join(input_iterator))
output_lines = output.split("\n")
Entonces, ¿cómo puedo tener mi subproceso leer desde una iterador línea por línea mientras leo de su stdout línea por línea?
Si usas 'exit()' en el proceso hijo, se genera 'SystemExit'. En su lugar, debería usar ['os._exit (0)'] (https://docs.python.org/2/library/os.html#os._exit) – hakanc
[use 'Thread()' en lugar de 'os.fork() '] (http://stackoverflow.com/a/32331150/4279) para la portabilidad y para evitar varios problemas difíciles de depurar. Aquí hay un ejemplo de posibles problemas con 'os.fork()': [Los bloqueos en la biblioteca estándar deben desinfectarse en la bifurcación] (http://bugs.python.org/issue6721) – jfs