Мой python script использует подпроцесс для вызова утилиты 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()
Поведение, которое я действительно хочу, - это фильтр script для печати каждой строки по мере ее получения из подпроцесса. Сорта похожа на то, что tee
, но с кодом python.
Что мне не хватает? Возможно ли это?
Update:
Если 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()