i tienen una construcción similar a la siguiente:encadenamiento subprocesos Popen adecuadamente
os.mkfifo('pipe.tmp')
enc = Popen(['encoder', '-i', 'pipe.tmp'])
cap = Popen(['capture', '-f', 'pipe.tmp'])
aquí cap
es un proceso que normalmente escribe en un archivo (especificado por -f
), pero se puede conseguir que arrojan los datos a la pantalla suministrando /dev/stdout
como el archivo de salida. de forma similar, enc
espera leer de un objeto similar a un archivo, y puedo leerlo desde la tubería suministrando -
como entrada. así que en vez de utilizar una tubería con nombre en el sistema operativo, pensé que el archivo especial puede no ser necesario, puedo utilizar un tubo sin nombre como esto ..
cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE)
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout)
cap.stdout.close()
(nota también la reversión del orden de desove). Me gusta más esto porque un archivo temporal parece innecesario, pero estoy un poco preocupado sobre si este constructo encadena los procesos de la manera que espero.
- es el
/dev/stdout
quecap
está hablando a diferencia de la salida estándar real en el sistema operativo? es decir, con el tubo de entrada-
enenc
¿obtendré un canal limpio de datos entre estos dos procesos, incluso si otros procesos están conversando en/dev/stdout en el sistema operativo? - ¿habrá diferencias significativas en el comportamiento con bloqueo/colas? Creo que en mi primer ejemplo la tubería con nombre será una memoria intermedia de 4096 bytes, y se bloqueará en cualquier extremo si
cap
/enc
no están escribiendo/leyendo lo suficientemente rápido, pero corríjanme si estoy equivocado. - ¿Se requiere algún orden especial de desove o terminación, o cualquier otro problema que deba tener en cuenta?