Mój skrypt Pythona używa podprocesu do wywołania bardzo głośnego narzędzia linux. Chcę zapisać wszystkie dane wyjściowe w pliku dziennika i pokazać niektóre z nich użytkownikowi. Myślałem, że następujące działania będą działać, ale dane wyjściowe nie są wyświetlane w mojej aplikacji, dopóki narzędzie nie wygeneruje znacznej ilości danych wyjściowych.
#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()
Naprawdę chcę, aby skrypt filtrujący wypisał każdą linię otrzymaną z podprocesu. Trochę jak to, co tee
robi, ale z kodem python.
czego mi brakuje? Czy to w ogóle możliwe?
Aktualizacja:
Jeśli a sys.stdout.flush()
zostanie dodane do fake_utility.py, kod ma pożądane zachowanie w Pythonie 3.1. Używam Pythona 2.6. Można by pomyśleć, że używanie proc.stdout.xreadlines()
działałoby tak samo jak py3k, ale tak nie jest.
Aktualizacja 2:
Oto minimalny działający kod.
#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,
zamiastprint line.rstrip()
(uwaga: przecinek na końcu).