Como posso descobrir por que subprocess.Popen wait () aguarda para sempre se stdout = cachimbo?

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

  •  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").

Foi útil?

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.

Outras dicas

Dê uma olhada na docs . Ele afirma que você não deve usar de espera, pois pode causar um bloqueio morto. Tente usar comunicar .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top