Мой 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()
