สคริปต์ 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()
พฤติกรรมที่ฉันต้องการจริงๆคือสคริปต์ตัวกรองเพื่อพิมพ์แต่ละบรรทัดตามที่ได้รับจากกระบวนการย่อย Sorta ชอบอะไรtee
แต่ด้วยรหัสหลาม
ฉันพลาดอะไรไป เป็นไปได้ไหม
ปรับปรุง:
หาก a sys.stdout.flush()
ถูกเพิ่มเข้าไปใน fake_utility.py รหัสจะมีพฤติกรรมที่ต้องการใน python 3.1 ฉันใช้ไพ ธ อน 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()
(หมายเหตุ: เครื่องหมายจุลภาคในตอนท้าย)