红颜莎娜
要获得子进程的逐行输出,只要子进程刷新了它的标准输出缓冲区:#!/usr/bin/env python2from 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() # wait for the subprocess to exititer()用于在行被写入解决方案时立即读取它们。Python 2中的预读错误.如果子进程的stdout在非交互模式下使用块缓冲而不是行缓冲(这会导致输出延迟,直到子进程的缓冲区已满或被子进程显式刷新为止),那么您可以尝试使用pexpect, pty模块或unbuffer, stdbuf, script公用事业,见问:为什么不直接使用管道(popen()?下面是Python 3代码:#!/usr/bin/env python3from subprocess import Popen, PIPEwith Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')注意:不像Python 2那样输出子进程的字节串;Python 3使用文本模式(cmd的输出使用locale.getpreferredencoding(False)编码)