无法从(Python)subprocess.check_output()获取stdout/stderr()

无法从(Python)subprocess.check_output()获取stdout/stderr()

问题描述:

我试图从git add命令中获取消息,以便日后打印到日志文件。无法从(Python)subprocess.check_output()获取stdout/stderr()

import subprocess 
import os 

filename = 'test.txt' 

# Add changes 
add_cmd = """git add "%s" """ % filename 
os.system(add_cmd) 
a = subprocess.check_output(add_cmd, shell=True, stderr=subprocess.STDOUT) 

os.system()呼叫显示屏幕:

fatal: Not a git repository (or any of the parent directories): .git 

这是正确的,因为这个文件夹是不是一个git回购。

subprocess.check_output()调用失败:

File "test.py", line 11, in <module> 
    a = subprocess.check_output(add_cmd, shell=True, stderr=subprocess.STDOUT) 
    File "/usr/lib/python2.7/subprocess.py", line 573, in check_output 
    raise CalledProcessError(retcode, cmd, output=output) 
subprocess.CalledProcessError: Command 'git add "test.txt" ' returned non-zero exit status 128 

为什么我不能够捕获错误消息subprocess.check_output()

从documenation为subprocess.check_output()

如果返回代码为非零它提出了一个CalledProcessErrorCalledProcessError对象将具有returncode属性中的返回码和output属性中的任何输出。

git add当出现错误条件时返回非零退出代码。捕获了异常,你的输出有:

try: 
    a = subprocess.check_output(add_cmd, shell=True, stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as cpe: 
    print cpe.output 

演示:

>>> import subprocess 
>>> import os 
>>> filename = 'test.txt' 
>>> add_cmd = """git add "%s" """ % filename 
>>> try: 
...  a = subprocess.check_output(add_cmd, shell=True, stderr=subprocess.STDOUT) 
... except subprocess.CalledProcessError as cpe: 
...  print cpe.output 
... 
fatal: Not a git repository (or any of the parent directories): .git 

>>> cpe.returncode 
128 

你可能不需要使用shell=True;代之以将列表作为参数传入,并且它们将在没有中介shell的情况下执行。这有额外的好处,你不必担心妥善逃跑filename

add_cmd = ['git', 'add', filename] 
try: 
    a = subprocess.check_output(add_cmd, stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as cpe: 
    print cpe.output