J'essaie d'écrire un script wrapper pour un programme de ligne de commande (svnadmin verify) qui affichera un bel indicateur de progression pour l'opération. Cela me oblige à être en mesure de voir chaque ligne de sortie du programme encapsulé dès sa sortie.
J'ai pensé que j'exécuterais simplement le programme en utilisant subprocess.Popen
, utiliserais stdout=PIPE
, puis lisais chaque ligne au fur et à mesure et agirais en conséquence. Cependant, lorsque j'ai exécuté le code suivant, la sortie semblait être mise en mémoire tampon quelque part, ce qui l'a amenée à apparaître en deux morceaux, les lignes 1 à 332, puis 333 à 439 (la dernière ligne de sortie)
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', '')
Après avoir regardé un peu la documentation sur le sous-processus, j'ai découvert le bufsize
paramètre à Popen
, donc j'ai essayé de définir bufsize sur 1 (tampon chaque ligne) et 0 (pas de tampon), mais aucune des valeurs ne semblait changer la façon dont les lignes étaient livrées.
À ce stade, je commençais à comprendre les pailles, j'ai donc écrit la boucle de sortie suivante:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
mais a obtenu le même résultat.
Est-il possible d'obtenir la sortie de programme «en temps réel» d'un programme exécuté à l'aide d'un sous-processus? Existe-t-il une autre option en Python qui est compatible avec l'avant (non exec*
)?
sydout=PIPE
pour que le sous-processus écrit directement sur votre console, en contournant le processus parent?