Mon script python utilise des sous-processus pour appeler un linux utilitaire qui est très bruyant. Je veux stocker la totalité de la production d'un fichier journal, mais seulement de montrer à l'utilisateur. Je pensais que le suivant, mais la sortie ne présentent que dans mon application jusqu'à ce que l'utilitaire a produit une quantité importante de la production.
#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, c'est pour le filtre de script pour imprimer chaque ligne comme il est reçu à partir du sous-processus. Sorta comme ce qu' tee
n'mais avec du code python.
Ce qui me manque? Est-ce même possible?
Mise à jour:
Si un sys.stdout.flush()
est ajouté à fake_utility.py le code du comportement souhaité en python 3.1. Je suis à l'aide de python 2.6. On pourrait penser que l'utilisation d' proc.stdout.xreadlines()
serait la même que py3k, mais il ne le fait pas.
Mise à jour 2:
Ici est le minimum de code de travail.
#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()