Como posso descobrir por que subprocess.Popen wait () aguarda para sempre se stdout = cachimbo?
-
22-07-2019 - |
Pergunta
Eu tenho um programa que grava stdout e, possivelmente, stderr. Eu quero executá-lo de python, capturando a stdout e stderr. Meus olhares código como:
from subprocess import *
p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()
Para um par de programas, esta multa funciona, mas quando eu adicionei um novo, o novo trava para sempre. Se eu remover stdout=PIPE
, o programa grava sua saída para o console e acabamentos e está tudo bem. Como posso determinar o que está causando o jeito?
Usando Python 2.5 no Windows XP. O programa não lê de stdin nem tem qualquer tipo de entrada do usuário (ou seja, "pressionar uma tecla").
Solução
Quando o buffer de um tubo enche (tipicamente 4KB ou assim), o processo de escrita pára até que um processo de leitura leu alguns dos dados em questão; mas aqui você está lendo nada até que o sub-processo é feito, daí o impasse. Os docs em wait
colocá-lo de forma muito clara, de fato:
Aviso Isto irá impasse se o processo filho gera uma saída suficiente para uma saída ou tubo de tal modo que stderr ele bloqueia esperando o tubo OS tampão de aceitar mais dados. Usar comunicam () para evitar isso.
Se você não pode usar communicate
por algum motivo, têm a gravação subprocess para um arquivo temporário, e então você pode wait
e ler esse arquivo quando estiver pronto - escrito para um arquivo, em vez de a um tubo, não faz risco de impasse.