Python subprocess git checkout devuelve error incluso si no hay error

Estoy escribiendo un guión para automatizar algunas tareas de GIT. Sé sobre GITPython pero prefiero no usar eso. Incluso difícil puede ser más fácil.

Obtuve el siguiente código:

def executeCommand(cmd): p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) out, error = p.communicate() if not error: return out.strip() else: print repr(out) print repr(error) print "Stopping execution!\r" exit(0) 

Esta pieza de código que recibe el command ['git', 'checkout', 'master'] hecho revisa el maestro. PERO dejará de ejecutarse, aparentemente porque la variable de error no está vacía. Traté de imprimir las salidas en caso de error, que es el siguiente:

 "Your branch is up-to-date with 'origin/master'.\n" "Switched to branch 'master'\n" Stopping execution! 

Como puede ver, verificó con éxito la twig maestra (también verificada por git status ). Pero, ¿por qué la segunda línea se completa con la variable de error? ¿Cómo manejar esto? ¿O no hay forma de manejar esto correctamente? ¿O no debería hacer ninguna comprobación de errores? ¿Cuál es la mejor solución / explicación para esto?

¡Gracias!

No es un error! es la salida en stderr 🙂

Si está en un terminal de Linux, puede probar esto ejecutando el siguiente

 git checkout master 2>/dev/null # You shouldn't see any output. # This is because git is writing those messages to stderr. 

De acuerdo con los documentos del subprocess

comunicar () devuelve una tupla (stdoutdata, stderrdata)

es decir, la salida en stdout y stderr.

Si desea verificar si hay errores, debe usar el atributo de returncode .

en tu caso

 stdout, stderr = p.communicate() if p.returncode == 0: return stdout.strip() else: # handle error print repr(stdout) print repr(stderr) print "stopping execution!\r" exit(0) 

La respuesta algrebe es la respuesta correcta para su pregunta, pero esto podría ayudarlo.

Idea es usar try, excepto ejecución y sondeo para verificar si ocurrió un error. Con algún event handling errores y formatting de respuesta (git devuelve una cadena con el carácter \ n para la nueva línea y así es como está escrita en la console) se obtiene una function genérica que maneja todos los commands de git.

 class GitError(Exception): def __init__(self, value): self.value = format_rows(value) def __str__(self): return repr(self.value) def execute(command, return_response=False): with Popen(command, shell=True, stdout=PIPE, stderr=PIPE) as process: try: response, error = process.communicate() except: process.kill() raise GitError('Fatal: Cannot execute command.') if process.poll(): raise GitError(get_decoded_lines(error)) if return_response: return format_rows(get_decoded_lines(response)) def get_decoded_lines(output): return output.decode().splitlines() def format_rows(formatted_lines): return '\n'.join(formatted_lines)