Мій скрипт 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()
(примітка: кома в кінці).