Para comenzar y controlar un proceso externo a través de STDIN / STDOUT con Python
-
23-08-2019 - |
Pregunta
I necesidad de lanzar un proceso externo que va a ser controlado a través de los mensajes enviados hacia atrás y adelante a través de la entrada estándar y la salida estándar. Usando subprocess.Popen estoy en condiciones de iniciar el proceso, pero soy incapaz de controlar la ejecución a través de la entrada estándar mientras que necesito.
El flujo de lo que estoy tratando de completar es:
- Iniciar el proceso externo
- Iterar para algún número de pasos
- Dile al proceso externo para completar el siguiente paso del proceso de escribir un carácter de nueva línea que es la entrada estándar
- Espere a que el proceso externo para indicar que ha finalizado el paso a escribir un carácter de nueva línea es la salida estándar
- Cierre la entrada estándar del proceso externo para indicar que el proceso externo que la ejecución se ha completado.
He llegado con el siguiente hasta el momento:
process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE);
for i in xrange(StepsToComplete):
print "Forcing step # %s"%i
process.communicate(input='\n')
Al ejecutar el código anterior el '\ n' no se comunica al proceso externo, y nunca ir más allá de paso # 0. Los bloques de código en process.communicate () y no de seguir adelante. Estoy utilizando el comunican () de forma incorrecta?
También cómo iba a poner en práctica el "esperar hasta que el proceso externo escribe una línea nueva" pieza de funcionalidad?
Solución
process.communicate (entrada = '\ n') es incorrecto. Si usted se dará cuenta de la documentación de Python, escribe su cadena a la entrada estándar del niño, a continuación, lee toda la salida desde el niño hasta que se salga del niño. De doc.python.org:
Popen.communicate (entrada = None) Interact con el proceso: Enviar datos a la entrada estándar. Leer datos de stdout y stderr, hasta se alcanza al final de su archivo. Esperar terminación del proceso. el opcional argumento de entrada debe ser una cadena de ser enviado al proceso hijo, o ninguno, Si no hay datos deben ser enviados a la niño.
En su lugar, sólo quiere escribir en la entrada estándar del niño. A continuación, leer de él en su bucle.
algo más parecido a:
process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE);
for i in xrange(StepsToComplete):
print "Forcing step # %s"%i
process.stdin.write("\n")
result=process.stdout.readline()
Esto va a hacer algo más parecido a lo que desea.
Otros consejos
Se puede usar trenzado, mediante el uso de reactor.spawnProcess y LineReceiver .