获取STDOUT,STDERR而无需等待进程退出

时间:2014-09-16 02:31:17

标签: python subprocess stdout stderr

我是一个Python noob。

有些进程会在很长一段时间后退出,并且它们的状态会不断写入STDOUT。

如何在不等待进程退出的情况下运行进程并读取其STDOUT?

我试过了:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
o = p.communicate()[0] # Waits until process exits, also tried p.stdout.read()
print o                # Isn't printed until process exists
do_something(o)        # Doesn't get executed until process exits

1 个答案:

答案 0 :(得分:1)

逐行阅读

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
for line in p.stdout:
    do work here
p.wait()
if p.returncode != 0:
    panic here

...居多。命令倾向于缓冲不同,具体取决于它们是从conole还是其他程序运行。由于你不是一个控制台,你可能会发现它的输出频率较低......但它最终会在程序退出之前到达那里。在linux上你可以使用pty或pexpect或者其他东西,但我知道在windows上没有好的解决方案。

现在,如果要并行运行它们,请在编程结束时为每个运行的命令创建一个线程并创建thread.join()。这本身有点棘手。你可以使用一个线程池(参见python 2.x上的multiprocessing.ThreadPool,不记得3.x中的名字)。