Pregunta ¿Cómo puedo averiguar por qué el subproceso.Popen wait () espera para siempre si stdout = PIPE?


Tengo un programa que escribe en stdout y posiblemente en stderr. Quiero ejecutarlo desde python, capturando stdout y stderr. Mi código se ve así:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()

Para un par de programas, funciona bien, pero cuando agregué uno nuevo, el nuevo se cuelga para siempre. Si elimino stdout=PIPE, el programa escribe su salida a la consola y termina y todo está bien. ¿Cómo puedo determinar qué está causando el bloqueo?

Usando Python 2.5 en Windows XP. El programa no lee de stdin ni tiene ningún tipo de entrada de usuario (es decir, "presionar una tecla").


17
2017-09-18 16:30


origen


Respuestas:


Cuando se llena el buffer de una tubería (típicamente 4KB más o menos), el proceso de escritura se detiene hasta que un proceso de lectura haya leído algunos de los datos en cuestión; pero aquí no está leyendo nada hasta que se complete el subproceso, de ahí el punto muerto. Los documentos en wait lo puso muy claro de hecho:

Advertencia Esto bloqueará si el   el proceso hijo genera suficiente salida   a una tubería stdout o stderr tal que   bloquea la espera de la tubería del sistema operativo   búfer para aceptar más datos. Utilizar   comunicar () para evitar eso.

Si no puedes usar communicate por alguna razón, haga que el subproceso escriba en un archivo temporal, y luego puede wait y lea ese archivo cuando esté listo: escribir en un archivo, en lugar de hacerlo en una tubería, no corre el riesgo de un punto muerto.


36
2017-09-18 16:36



Eche un vistazo a la documentos. Indica que no debe usar wait ya que puede causar un bloqueo muerto. Intenta usar comunicar.


1
2017-09-18 16:37