Мой скрипт на python использует подпроцесс для вызова очень шумной утилиты linux. Я хочу сохранить весь вывод в файл журнала и показать некоторые из них пользователю. Я думал, что следующее будет работать, но вывод не будет отображаться в моем приложении, пока утилита не выдаст значительный объем вывода.
#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()
Я действительно хочу, чтобы скрипт фильтра печатал каждую строку, полученную от подпроцесса. Сорт, как то, что tee
делает, но с кодом Python.
Чего мне не хватает? Это вообще возможно?
Обновить:
Если a sys.stdout.flush()
добавлено в fake_utility.py, код имеет желаемое поведение в Python 3.1. Я использую Python 2.6. Вы можете подумать, что использование proc.stdout.xreadlines()
будет работать так же, как py3k, но это не так.
Обновление 2:
Вот минимальный рабочий код.
#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,
вместоprint line.rstrip()
(примечание: запятая в конце).