Python-使用子流程获取实时输出

我正在尝试为命令行程序(svnadmin verify)编写包装脚本,该脚本将显示该操作的良好进度指示器。这要求我一看到包装程序的输出,就能够看到它的每一行。

我认为我只是使用subprocess.Popenuse 来执行程序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*)?

回答:

我尝试了这个,并且出于某种原因而在代码中

for line in p.stdout:

...

积极地缓冲,变体

while True:

line = p.stdout.readline()

if not line: break

...

以上是 Python-使用子流程获取实时输出 的全部内容, 来源链接: utcz.com/qa/411027.html

回到顶部