Skrip python saya menggunakan subproses untuk memanggil utilitas linux yang sangat bising. Saya ingin menyimpan semua output ke file log dan menunjukkan sebagian kepada pengguna. Saya pikir yang berikut ini akan berfungsi, tetapi output tidak muncul di aplikasi saya sampai utilitas telah menghasilkan sejumlah besar output.
#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()
Perilaku yang saya benar-benar inginkan adalah skrip filter untuk mencetak setiap baris saat diterima dari subproses. Agak seperti apa tee
tetapi dengan kode python.
Apa yang saya lewatkan? Apakah ini mungkin?
Memperbarui:
Jika a sys.stdout.flush()
ditambahkan ke fake_utility.py, kode tersebut memiliki perilaku yang diinginkan dalam python 3.1. Saya menggunakan python 2.6. Anda akan berpikir bahwa menggunakan proc.stdout.xreadlines()
akan bekerja sama dengan py3k, tetapi tidak.
Pembaruan 2:
Ini adalah kode kerja minimal.
#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,
sebagai gantinyaprint line.rstrip()
(catatan: koma di akhir).