Captura bash / git fatal en python

Me gustaría escribir un script de python simple que pueda clonar un repository de git en el directory deseado. Utilicé el bash … excepto la construcción para poder detectar todas las excepciones, sin embargo, parece que no puedo manejar "fatal" correctamente.

#!/usr/bin/env python import subprocess try: subprocess.check_call(['git', 'clone', 'git clone git@some_repo', '/tmp/some_directory']) except Exception: print "There was a problem during repository configuration" 

El resultado del script anterior:

fatal: el repository 'git clone git @ some_repo' no existe

Hubo un problema durante la configuration del repository

Para ser más específico, estaba esperando recibir solo el post "Hubo un …". ¿Por qué recibo un post "fatal" también?

STDERR capturar STDERR de la ejecución de subprocess.check_call() . Consulte Catch stderr en subprocess.check_call sin usar el subprocess.PIPE

para detalles.

El post que está viendo es producido por el command git .

Si desea evitar que aparezca ese post, debe networkingirigir cualquier error estándar o todos los resultados a /dev/null través de un shell, como:

 subprocess.check_call(['git', 'clone', 'git clone git@some_repo', '/tmp/some_directory', '2&>/dev/null'], shell=True) 

Sin embargo, recomendaría contra esa práctica ya que pierde información sobre la causa real del error.

Como se especificó anteriormente, debe capturar el error estándar. Además, como especifica la documentation, subprocess.check_call() solo genera una exception cuando el código de retorno no es cero.

Entonces, puedes imitar el comportamiento de la siguiente manera:

 #!/usr/bin/env python import subprocess def clone_repository(): # customize your function parameters # prepare the arguments with your function parameters arguments = ['git', 'clone', 'git clone git@some_repo', '/tmp/some_directory'] git_proc = subprocess.Popen(arguments) stdout, stderr = git_proc.communicate() if git_proc.returncode != 0: raise subprocess.CalledProcessError(arguments, git_proc.returncode) return stdout, stderr try: stdout, stderr = clone_repository() except (OSError, ValueError) as e: # this errors out when the arguments are invalid (ValueError) # or when there is an underlying file missing, etc (OSError) # put the print that you require for these errors pass except subprocess.CalledProcessError: # you could use stderr to determine the underlying error print "There was a problem during repository configuration"