python - example - ¿Cómo puedo averiguar por qué subprocess.Popen wait() espera para siempre si stdout=PIPE?
subprocess python 3 example (2)
Cuando el búfer de una tubería se llena (generalmente 4KB o menos), el proceso de escritura se detiene hasta que el proceso de lectura ha leído algunos de los datos en cuestión; pero aquí no se lee nada hasta que se termina el subproceso, de ahí el punto muerto. Los documentos en wait
pusieron muy claro:
Advertencia Esto se interrumpirá si el proceso hijo genera suficiente salida en una salida estándar o en una tubería estándar, de modo que bloquea la espera de que el búfer de la tubería del sistema operativo acepte más datos. Utilice comunicarse () para evitar eso.
Si no puede utilizar la communicate
por algún motivo, haga que el subproceso escriba en un archivo temporal, y luego puede wait
y leer ese archivo cuando esté listo: escribir en un archivo, en lugar de hacerlo en una tubería, no conlleva ningún riesgo de interbloqueo.
Tengo un programa que escribe en stdout y posiblemente stderr. Quiero ejecutarlo desde python, capturando stdout y stderr. Mi código se ve como:
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 cuelga para siempre. Si 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?
Usando python 2.5 en Windows XP. El programa no lee desde stdin ni tiene ningún tipo de entrada por parte del usuario (es decir, "pulsar una tecla").
Echa un vistazo a los documentos . Indica que no debe usar esperar, ya que puede provocar un bloqueo. Trate de usar communicate .