2016-08-12 1 views
2

Ich versuche, die Nachricht von einem git add Befehl zu erhalten, um später in eine Protokolldatei zu drucken.Kann stdout/stderr nicht von (Python) subprocess.check_output()

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) 

Der os.system() Aufruf zeigt in Bildschirm:

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

, die korrekt ist, da dieser Ordner kein git Repo ist.

Aber der subprocess.check_output() Aufruf schlägt fehl mit:

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 

Warum bin ich die Fehlermeldung zu fangen mit subprocess.check_output() nicht in der Lage?

Antwort

7

Vom documenation für subprocess.check_output():

Wenn der Rückgabecode nicht Null war wirft es ein CalledProcessError. Das CalledProcessError Objekt wird den Rückgabecode in dem returncode Attribut und jeder Ausgabe in dem output Attribut haben.

git add gibt bei einem Fehler einen Nicht-Null-Exitcode zurück. Fangen Sie diese Ausnahme ist die Ausgabe dort:

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

Demo:

>>> 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 

Sie wahrscheinlich nicht brauchen shell=True zu verwenden; übergeben Sie Ihre Argumente als Liste stattdessen und sie werden ohne eine Zwischenschale ausgeführt werden. Dies hat den zusätzlichen Vorteil, dass Sie sich keine Sorgen darüber machen müssen, dass Sie richtig entkommen filename:

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