无法从(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()
:
如果返回代码为非零它提出了一个
CalledProcessError
。CalledProcessError
对象将具有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