Sto cercando di scrivere uno script wrapper per un programma a riga di comando (verifica svnadmin) che visualizzerà un indicatore di avanzamento gradevole per l'operazione. Ciò richiede che io sia in grado di vedere ogni riga di output dal programma spostato non appena viene emesso.
Ho pensato che avrei semplicemente eseguito il programma usando subprocess.Popen
, usando stdout=PIPE
, quindi leggendo ogni riga appena arrivata e agendo di conseguenza su di esso. Tuttavia, quando ho eseguito il seguente codice, l'output sembrava essere bufferizzato da qualche parte, facendolo apparire in due blocchi, le righe da 1 a 332, quindi da 333 a 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 esaminato un po 'la documentazione sui sottoprocessi, ho scoperto il bufsize
parametro toPopen
, quindi ho provato a impostare bufsize su 1 (buffer per riga) e 0 (nessun buffer), ma nessuno dei due valori sembrava cambiare il modo in cui venivano consegnate le righe.
A questo punto stavo iniziando a cogliere la paglia, quindi ho scritto il seguente loop di output:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
ma ha 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 che è compatibile con il futuro (no exec*
)?
sydout=PIPE
così il sottoprocesso scrive direttamente sulla tua console, aggirando il processo genitore?