2016-08-12 8 views
2

git addコマンドからメッセージを取得しようとしていて、後でログファイルに出力しようとしています。(ファイアウォール)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()コールが画面に示す:このフォルダがgitレポないので、正しい

fatal: Not a git repository (or any of the parent directories): .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()と、エラーメッセージをキャッチすることはできませんよ?

答えて

7

subprocess.check_output()ためdocumenationから:

リターンコードは、それが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を使用する必要はありません。あなたの引数をリストとして渡してください。それらは中間のシェルなしで実行されます。これにより、適切にエスケープすることを心配する必要がなくなるという追加の利点があります

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