Ответ 1
Рассматривали ли вы использование GitPython? Он предназначен для обработки всей этой ерунды для вас.
import git
g = git.cmd.Git(git_dir)
g.pull()
Используя веб-узлы 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?
Рассматривали ли вы использование GitPython? Он предназначен для обработки всей этой ерунды для вас.
import git
g = git.cmd.Git(git_dir)
g.pull()
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.
Это образец рецепта, который я использовал в одном из моих проектов. Согласился, что есть несколько способов сделать это.:)
>>> 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
и т.д.
Try:
subprocess.Popen("git pull", stdout=subprocess.PIPE, shell=True)