将subprocess.Popen stderr重定向到控制台

时间:2016-10-12 16:07:59

标签: python

我正在使用subprocess.Popen执行make命令。但是当make失败时,我没有得到make的确切错误,而esst只是继续运行。如何让脚本停止并向控制台显示make命令的输出

def app(self, build, soc, target):
    command = "make BUILD=%s SOC=%s TARGET=%s" % (build, soc, target)
    subprocess.Popen(command.split(), shell=False,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE).communicate()

2 个答案:

答案 0 :(得分:2)

你可以尝试更换:

subprocess.Popen(command.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

使用:

p = subprocess.Popen(command.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print p.communicate()
print p.returncode

让我们知道打印输出的样子。

答案 1 :(得分:0)

如果您希望make输出实际转到控制台,请不要将subprocess.PIPE用于stdout / stderr。默认情况下,被调用的进程将使用Python进程的stdout / stderr句柄。在这种情况下,如果被调用进程返回非零退出代码,则可以使用subprocess.check_call()函数引发subprocess.CalledProcessError

subprocess.check_call(command.split())

但是,如果您需要捕获make输出以在脚本中使用,则可以使用类似的subprocess.check_output()函数:

try:
    output = subprocess.check_output(command.split(), stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    output = e.output
    # error handling here

请注意,这会将stdout和stderr输出合并为一个值。如果您需要单独使用它们,则需要将subprocess.Popen构造函数与.communicate()方法结合使用,并手动检查returncode对象的Popen属性:

p = subprocess.Popen(command.split(), stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
    # raise exception or other error handling here