Para comenzar y controlar un proceso externo a través de STDIN / STDOUT con Python

StackOverflow https://stackoverflow.com/questions/1087799

  •  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:

  1. Iniciar el proceso externo
  2. Iterar para algún número de pasos
    1. 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
    2. 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
  3. 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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top