Tôi đang cố gắng viết một kịch bản trình bao bọc cho một chương trình dòng lệnh (svnadmin xác minh) sẽ hiển thị một chỉ báo tiến trình tốt đẹp cho hoạt động. Điều này đòi hỏi tôi phải có thể nhìn thấy từng dòng đầu ra từ chương trình được gói ngay khi nó là đầu ra.
Tôi hình dung rằng tôi chỉ thực hiện chương trình bằng cách sử dụng subprocess.Popen
, sử dụng stdout=PIPE
, sau đó đọc từng dòng khi nó đến và hành động theo nó. Tuy nhiên, khi tôi chạy đoạn mã sau, đầu ra dường như được đệm ở đâu đó, khiến nó xuất hiện thành hai đoạn, dòng 1 đến 332, sau đó là 333 đến 439 (dòng đầu ra cuối cùng)
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', '')
Sau khi xem tài liệu về quy trình con một chút, tôi phát hiện ra bufsize
tham sốPopen
, vì vậy tôi đã thử đặt bufsize thành 1 (đệm mỗi dòng) và 0 (không có bộ đệm), nhưng dường như không có giá trị nào thay đổi cách phân phối các dòng.
Tại thời điểm này tôi đã bắt đầu nắm bắt được ống hút, vì vậy tôi đã viết vòng lặp đầu ra sau:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
nhưng nhận được kết quả tương tự.
Có thể lấy đầu ra chương trình 'thời gian thực' của chương trình được thực hiện bằng quy trình con không? Có một số tùy chọn khác trong Python tương thích về phía trước (không exec*
) không?
sydout=PIPE
để quá trình con ghi trực tiếp vào bàn điều khiển của bạn, bỏ qua quá trình cha?