for - ¿Cómo puedo llamar a ''git pull'' desde dentro de Python?
git for python (4)
¿Has considerado usar GitPython? Está diseñado para manejar todas estas tonterías para ti.
import git
g = git.cmd.Git(git_dir)
g.pull()
Utilizando los webhooks de github, me gustaría poder realizar cualquier cambio en un servidor de desarrollo remoto. Por el momento, cuando se encuentra en el directorio apropiado, git pull
obtiene los cambios que deben realizarse. Sin embargo, no puedo entender cómo llamar a esa función desde dentro de Python. He probado lo siguiente:
import subprocess
process = subprocess.Popen("git pull", stdout=subprocess.PIPE)
output = process.communicate()[0]
Pero esto produce el siguiente error
Rastreo (llamada más reciente): Archivo "", línea 1, en Archivo "/usr/lib/python2.7/subprocess.py", línea 679, en init errread, errwrite) Archivo "/ usr / lib / python2. 7 / subprocess.py ", línea 1249, en _execute_child raise child_exception OSError: [Errno 2] No existe dicho archivo o directorio
¿Hay alguna forma de que pueda llamar a este comando bash desde dentro de Python?
Esta es una receta de muestra que he estado usando en uno de mis proyectos. Acordó que hay múltiples formas de hacer esto sin embargo. :)
>>> import subprocess, shlex
>>> git_cmd = ''git status''
>>> kwargs = {}
>>> kwargs[''stdout''] = subprocess.PIPE
>>> kwargs[''stderr''] = subprocess.PIPE
>>> proc = subprocess.Popen(shlex.split(git_cmd), **kwargs)
>>> (stdout_str, stderr_str) = proc.communicate()
>>> return_code = proc.wait()
>>> print return_code
0
>>> print stdout_str
# On branch dev
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# file1
# file2
nothing added to commit but untracked files present (use "git add" to track)
>>> print stderr_str
El problema con su código era que no estaba pasando una matriz por el subprocess.Popen()
y, por lo tanto, estaba tratando de ejecutar un solo binario llamado git pull
. En su lugar, necesita ejecutar el git
binario con el primer argumento siendo pull
y así sucesivamente.
Tratar:
subprocess.Popen("git pull", stdout=subprocess.PIPE, shell=True)
subprocess.Popen
espera una lista del nombre y los argumentos del programa. Le está pasando una sola cadena, que es (con el valor predeterminado shell=False
) equivalente a:
[''git pull'']
Esto significa que el subproceso intenta encontrar un programa llamado literalmente git pull
y no lo hace: en Python 3.3, su código genera la excepción FileNotFoundError: [Errno 2] No such file or directory: ''git pull''
. En cambio, pase una lista como esta:
import subprocess
process = subprocess.Popen(["git", "pull"], stdout=subprocess.PIPE)
output = process.communicate()[0]
Por cierto, en Python 2.7+, puede simplificar este código con la función de check_output
:
import subprocess
output = subprocess.check_output(["git", "pull"])
Además, para usar la funcionalidad de git, de ninguna manera es necesario (aunque sea simple y portátil) llamar al git binary. Considera usar https://github.com/gitpython-developers/GitPython o Dulwich .