Estoy tratando de hablar con un proceso hijo utilizando la subproceso python.Popen() llamada. En mi código real, estoy implementando un tipo de IPC, por lo que quiero escribir algunos datos, leer la respuesta, escribir algunos datos más, leer la respuesta, etc. Debido a esto, no puedo usar Popen.communicate(), que de otra manera funciona bien para el caso simple.Lectura/escritura en un subproceso Popen()
Este código muestra mi problema. Nunca recibe la primera respuesta, se cuelga en el primer "resultado de lectura". ¿Por qué? ¿Cómo puedo hacer que esto funcione como espero? salida
import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
p.stdin.write("abc\n")
print "Reading result:"
print p.stdout.readline()
p.stdin.write("cat\n")
print "Reading result:"
print p.stdout.readline()
De hecho, ¡funciona! Mi sed por alguna razón usa -u para "sin búfer", no -l, pero funciona de todos modos. Esto resuelve mi código de ejemplo, pero lamentablemente no es mi código real, ya que el comando real no está sed, sino otro programa de Python. Sin embargo, buena respuesta, identificaste el problema. –
Sí, problema resuelto. El problema fue el almacenamiento en búfer de salida del resultado. Hacer un simple stdout.flush() en mi subproceso resolvió el problema. ¡Gracias! –