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

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

  •  22-07-2019
  •  | 
  •  

Pregunta

Tengo un programa que escribe en stdout y posiblemente 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, esto funciona bien, pero cuando agregué uno nuevo, el nuevo se cuelga para siempre. Si elimino stdout = PIPE , el programa escribe su salida en la consola y termina y todo está bien. ¿Cómo puedo determinar qué está causando el bloqueo?

Uso de python 2.5 en Windows XP. El programa no lee desde stdin ni tiene ningún tipo de entrada del usuario (es decir, "presione una tecla").

¿Fue útil?

Solución

Cuando el búfer de una tubería se llena (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 realiza el subproceso, de ahí el punto muerto. Los documentos en wait lo ponen muy claramente:

  

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

Si no puede usar comunicar por alguna razón, haga que el subproceso escriba en un archivo temporal, y luego puede esperar y leer ese archivo cuando esté listo. - escribir en un archivo, en lugar de en una tubería, no se arriesga a un punto muerto.

Otros consejos

Eche un vistazo a los documentos . Establece que no debe usar esperar, ya que puede causar un bloqueo muerto. Intente usar comunicar .

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