for python git bash github

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

https://github.com/gitpython-developers/GitPython

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 .