Estou tentando escrever um script de wrapper para um programa de linha de comando (svnadmin Verifique) que exibirá um bom indicador de progresso para a operação. Isso exige que eu seja capaz de ver cada linha de saída do programa empacotado assim que for lançada.
Imaginei que apenas executaria o programa usando subprocess.Popen
, use stdout=PIPE
e depois leria cada linha conforme ela chegasse e atuaria de acordo. No entanto, quando executei o código a seguir, a saída parecia estar armazenada em buffer em algum lugar, fazendo com que aparecesse em dois blocos, linhas 1 a 332 e depois 333 a 439 (a última linha de saída)
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
Depois de examinar um pouco a documentação do subprocesso, descobri o bufsize
parâmetroPopen
, então tentei definir o bufsize como 1 (buffer cada linha) e 0 (sem buffer), mas nenhum valor parecia mudar a maneira como as linhas estavam sendo entregues.
Nesse ponto, eu estava começando a procurar por canudos, então escrevi o seguinte loop de saída:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
mas obteve o mesmo resultado.
É possível obter a saída do programa 'em tempo real' de um programa executado usando subprocesso? Existe alguma outra opção no Python que seja compatível com a frente (não exec*
)?
sydout=PIPE
gravação para que o subprocesso grave diretamente no console, ignorando o processo pai?