Подтвердить что ты не робот

Как я могу вызвать 'git pull' из Python?

Используя веб-узлы github, я хотел бы получить любые изменения на удаленном сервере разработки. В настоящий момент, когда в соответствующем каталоге git pull получаются любые изменения, которые необходимо внести. Однако я не могу понять, как вызвать эту функцию из Python. Я пробовал следующее:

import subprocess
process = subprocess.Popen("git pull", stdout=subprocess.PIPE)
output = process.communicate()[0]

Но это приводит к следующей ошибке

Traceback (последний последний вызов): Файл ", строка 1, в    Файл" /usr/lib/python 2.7/subprocess.py ", строка 679, в INIT    errread, errwrite) Файл" /usr/lib/python 2.7/subprocess.py", строка 1249, в _execute_child     raise child_exception OSError: [Errno 2] Нет такого файла или каталога

Есть ли способ, который я могу назвать этой командой bash из Python?

4b9b3361

Ответ 1

Рассматривали ли вы использование GitPython? Он предназначен для обработки всей этой ерунды для вас.

import git 

g = git.cmd.Git(git_dir)
g.pull()

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

Ответ 2

subprocess.Popen ожидает список имен и аргументов программы. Вы передаете ему одну строку, которая (со значением по умолчанию shell=False) эквивалентна:

['git pull']

Это означает, что подпроцесс пытается найти программу с именем буквально git pull и не может этого сделать: в Python 3.3 ваш код вызывает исключение FileNotFoundError: [Errno 2] No such file or directory: 'git pull'. Вместо этого перейдите в список, например:

import subprocess
process = subprocess.Popen(["git", "pull"], stdout=subprocess.PIPE)
output = process.communicate()[0]

Кстати, в Python 2.7+ вы можете упростить этот код с помощью функции check_output:

import subprocess
output = subprocess.check_output(["git", "pull"])

Кроме того, чтобы использовать функциональность git, он не обязательно (хотя и простой и переносимый) для вызова двоичного кода git. Рассмотрите возможность использования git -python или Dulwich.

Ответ 3

Это образец рецепта, который я использовал в одном из моих проектов. Согласился, что есть несколько способов сделать это.:)

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

Проблема с вашим кодом заключалась в том, что вы не передавали массив для subprocess.Popen() и, следовательно, пытались запустить один двоичный код под названием git pull. Вместо этого ему нужно выполнить двоичный git с первым аргументом pull и т.д.

Ответ 4

Try:

subprocess.Popen("git pull", stdout=subprocess.PIPE, shell=True)