Python Ejecuta un subproceso de daemon y lee la salida estándar

Necesito ejecutar un progtwig y reunir su salida a la salida estándar. Este progtwig (socat) debe ejecutarse en segundo plano durante la duración de la secuencia de comandos de python. Socat se encuentra en modo dameon una vez que se ejecuta, pero primero genera algunas líneas a la salida estándar que necesito para el rest de mi script.

Comando: socat -d -d PTY: PTY:

Salida:

 2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/1 2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/2 2011/03/23 21:12:35 socat[7476] N starting data transfer loop with FDs [3,3] and [5,5] 

Básicamente, quiero ejecutar eso al inicio de mi progtwig y dejarlo ejecutándose hasta la terminación del script, pero necesito leer los dos nombres / dev / pts / X en python.

¿Puede alguien decirme cómo hacer esto?

Se me ocurrió esto, que simplemente se cuelga, supongo que porque está bloqueando el proceso secundario para que finalice.

 #!/usr/bin/python from subprocess import Popen, PIPE, STDOUT cmd = 'socat -d -d PTY: PTY: &' p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) output = p.stdout.read() # Process the output print(output) 

Gracias por cualquier ayuda

EDITAR: Parece que puede escribir en stderr, pero la secuencia de comandos aún varía con y sin la lectura & desde stderr.

 #!/usr/bin/python from subprocess import Popen, PIPE, STDOUT import pty import os cmd = 'socat -d -d PTY: PTY:' master, slave = pty.openpty() p = Popen(cmd, shell=True, stdin=PIPE, stdout=slave, stderr=slave, close_fds=True) stdout = os.fdopen(master) print stdout.readline() print stdout.readline() 

Hay dos problemas con su versión. En primer lugar, se llama lectura sin argumento, lo que significa que intentará leer todo. Pero como socat no termina, nunca decide que ha leído todo. Al usar readline, python solo lee hasta que encuentra una nueva línea. De mi comprensión de tu problema, eso es lo que necesitas.

El segundo problema es que la biblioteca estándar de C almacenará los resultados en las tuberías. Resolvemos eso creando una pty con la función openpty () y pasándola a stdout y stderr del subproceso. Usamos fdopen para convertir ese descriptor de archivo en un objeto Python normal y nos deshacemos del búfer.

No sé qué está haciendo con el socat, pero me pregunto si podría reemplazarse utilizando el módulo pty. Estás copiando una pty a otra, y openpty está creando un par de ptys. Tal vez puedas usarlos directamente?

El subproceso probablemente nunca cierre la salida estándar, por lo que la llamada read() espera para siempre. Para empeorar las cosas, probablemente almacenará en búfer su salida cuando descubra que se trata de una canalización en lugar de una consola (la biblioteca estándar de C hace esto automáticamente, por lo que no es una función de cómo está escrita la aplicación). Si es así, probablemente la única opción sea usar una biblioteca de estilo expectativa como Pexpect .

Si lo suministra con una tubería para stdout y stderr, creo que el subproceso bloqueará la espera de que se lean las tuberías. .read () debería leer a EOF, creo. Entre ellos, esos dos problemas prolly hacen un punto muerto.

Sin embargo, creo que, dado que .read () leerá hasta EOF, se bloqueará incluso si no hay una tubería stderr.

Quieres pegar la lectura en un hilo, creo.