Mon script python utilise un sous-processus pour appeler un utilitaire Linux très bruyant. Je veux stocker toute la sortie dans un fichier journal et en montrer une partie à l'utilisateur. Je pensais que ce qui suit fonctionnerait, mais la sortie n'apparaît dans mon application que lorsque l'utilitaire a produit une quantité importante de sortie.
#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
print hex(i)*512
i += 1
time.sleep(0.5)
#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
#the real code does filtering here
print "test:", line.rstrip()
Le comportement que je veux vraiment est que le script de filtre imprime chaque ligne telle qu'elle est reçue du sous-processus. Sorta comme quoi, tee
mais avec du code python.
Qu'est-ce que je rate? Est-ce seulement possible?
Mettre à jour:
Si a sys.stdout.flush()
est ajouté à fake_utility.py, le code a le comportement souhaité en python 3.1. J'utilise python 2.6. On pourrait penser que l'utilisation proc.stdout.xreadlines()
fonctionnerait de la même manière que py3k, mais ce n'est pas le cas.
Mise à jour 2:
Voici le code de travail minimal.
#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
print i
sys.stdout.flush()
time.sleep(0.5)
#display out put line by line
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
#works in python 3.0+
#for line in proc.stdout:
for line in iter(proc.stdout.readline,''):
print line.rstrip()
print line,
place deprint line.rstrip()
(note: virgule à la fin).