我正在使用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()
答案 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