我正在尝试为命令行程序(svnadmin verify)编写包装脚本,该脚本将显示该操作的良好进度指示器。这要求我能够立即看到包装程序输出的每一行。
我认为我只是使用subprocess.Popen
,use 来执行程序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
子进程以使子进程绕过父进程直接写入控制台?