Sto provando a scrivere uno script wrapper per un programma della riga di comando (svnadmin verify) che visualizzerà un indicatore di progresso piacevole per l'operazione. Ciò richiede che sia in grado di vedere ogni riga di output dal programma avvolto non appena viene emesso.Ottenere l'output in tempo reale utilizzando il sottoprocesso
Ho pensato che avrei appena eseguito il programma utilizzando subprocess.Popen
, utilizzare stdout=PIPE
, quindi leggere ogni riga come è entrata e agire di conseguenza. Tuttavia, quando ho eseguito il seguente codice, l'uscita sembrava essere tamponato da qualche parte, facendolo apparire in due pezzi, righe da 1 a 332, poi 333 per 439 (l'ultima riga di output)
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', '')
Dopo aver guardato alla documentazione relativa al sottoprocesso un po ', ho scoperto il parametro bufsize
su Popen
, quindi ho provato a impostare bufsize su 1 (buffer su ciascuna riga) e su 0 (nessun buffer), ma nessuno dei due valori sembrava cambiare il modo in cui venivano consegnate le linee.
A questo punto stavo iniziando a cogliere per cannucce, così ho scritto il seguente ciclo di uscita:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
ma ho ottenuto lo stesso risultato.
È possibile ottenere l'output del programma "in tempo reale" di un programma eseguito utilizzando il sottoprocesso? C'è qualche altra opzione in Python compatibile con il futuro (non exec*
)?
Hai provato a omettere 'sydout = PIPE' in modo che il sottoprocesso scrive direttamente nella tua console, ignorando il processo padre? –
Il fatto è che voglio leggere l'output. Se viene emesso direttamente sulla console, come potrei farlo? Inoltre, non voglio che l'utente veda l'output del programma avvolto, solo il mio output. –
Allora perché un display "in tempo reale"? Non capisco il caso d'uso. –