ฉันกำลังพยายามเขียนสคริปต์ wrapper สำหรับโปรแกรมบรรทัดคำสั่ง (ตรวจสอบ svnadmin) ซึ่งจะแสดงตัวบ่งชี้ความคืบหน้าที่ดีสำหรับการดำเนินการ สิ่งนี้ต้องการให้ฉันสามารถเห็นแต่ละบรรทัดของเอาต์พุตจากโปรแกรมที่รวมไว้ได้ทันทีที่เอาต์พุต
ฉันคิดว่าฉันจะดำเนินการโปรแกรมโดยsubprocess.Popen
ใช้ใช้stdout=PIPE
แล้วอ่านแต่ละบรรทัดเมื่อเข้ามาและดำเนินการตามนั้น อย่างไรก็ตามเมื่อฉันรันโค้ดต่อไปนี้ผลลัพธ์ดูเหมือนจะถูกบัฟเฟอร์ที่ใดที่หนึ่งทำให้ปรากฏเป็นสองส่วนบรรทัดที่ 1 ถึง 332 จากนั้น 333 ถึง 439 (บรรทัดสุดท้ายของเอาต์พุต)
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
หลังจากดูเอกสารเกี่ยวกับกระบวนการย่อยเล็กน้อยฉันค้นพบbufsize
พารามิเตอร์เป็นPopen
ดังนั้นฉันจึงลองตั้งค่า bufsize เป็น 1 (บัฟเฟอร์แต่ละบรรทัด) และ 0 (ไม่มีบัฟเฟอร์) แต่ค่าทั้งสองดูเหมือนจะไม่เปลี่ยนวิธีการส่งบรรทัด
ณ จุดนี้ฉันเริ่มเข้าใจฟางดังนั้นฉันจึงเขียนลูปเอาต์พุตต่อไปนี้:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
แต่ได้ผลลัพธ์เดียวกัน
เป็นไปได้ไหมที่จะได้รับเอาต์พุตโปรแกรม 'เรียลไทม์' ของโปรแกรมที่เรียกใช้งานโดยใช้กระบวนการย่อย มีตัวเลือกอื่นใน Python ที่รองรับการส่งต่อ (ไม่ใช่exec*
) หรือไม่?
sydout=PIPE
กระบวนการย่อยเพื่อให้กระบวนการย่อยเขียนลงในคอนโซลของคุณโดยตรงโดยข้ามกระบวนการหลักหรือไม่?