Kịch bản python của tôi sử dụng quy trình con để gọi một tiện ích linux rất ồn. Tôi muốn lưu trữ tất cả các đầu ra vào một tệp nhật ký và hiển thị một số tệp đó cho người dùng. Tôi nghĩ rằng những điều sau đây sẽ hoạt động, nhưng đầu ra không hiển thị trong ứng dụng của tôi cho đến khi tiện ích tạo ra một lượng đầu ra đáng kể.
#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()
Hành vi tôi thực sự muốn là cho tập lệnh bộ lọc in từng dòng khi nó được nhận từ quy trình con. Sắp xếp như những gì tee
làm nhưng với mã python.
Tôi đang thiếu gì? Điều này thậm chí có thể?
Cập nhật:
Nếu a sys.stdout.flush()
được thêm vào fake_utility.py, mã có hành vi mong muốn trong python 3.1. Tôi đang sử dụng python 2.6. Bạn sẽ nghĩ rằng việc sử dụng proc.stdout.xreadlines()
sẽ hoạt động giống như py3k, nhưng không.
Cập nhật 2:
Đây là mã làm việc tối thiểu.
#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,
thay vìprint line.rstrip()
(lưu ý: dấu phẩy ở cuối).