Để nhận từng dòng đầu ra của quy trình con ngay khi quy trình con xóa bộ đệm stdout của nó:
from subprocess import Popen, PIPE
p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)
with p.stdout:
for line in iter(p.stdout.readline, b''):
print line,
p.wait()
iter()
được sử dụng để đọc các dòng ngay khi chúng được viết để giải quyết lỗi đọc trước trong Python 2 .
Nếu stdout của quy trình con sử dụng bộ đệm khối thay vì bộ đệm dòng ở chế độ không tương tác (dẫn đến sự chậm trễ trong đầu ra cho đến khi bộ đệm của trẻ đầy hoặc được xóa rõ ràng bởi trẻ) thì bạn có thể cố gắng buộc đầu ra không có bộ đệm bằng cách sử dụng pexpect
, pty
module hay unbuffer
, stdbuf
, script
tiện ích , xem Q: Tại sao không chỉ cần sử dụng một ống (popen ())?
Đây là mã Python 3:
from subprocess import Popen, PIPE
with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')
Lưu ý: Không giống như Python 2 xuất ra các bytestrings của quy trình con như nguyên trạng; Python 3 sử dụng chế độ văn bản (đầu ra của cmd được giải mã bằng cách sử dụng locale.getpreferredencoding(False)
mã hóa).