如何在Python中调用'git pull'?

0mkxixxg  于 2023-01-11  发布在  Git
关注(0)|答案(7)|浏览(202)

使用github webhook,我希望能够将任何更改拉到远程开发服务器上。目前,当在适当的目录中时,git pull获取需要进行的任何更改。但是,我不知道如何从Python中调用该函数。我尝试了以下方法:

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

但这会导致以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

有没有办法在Python中调用这个bash命令?

luaexgnf

luaexgnf1#

你考虑过使用GitPython吗?它的设计就是为了帮你处理这些无聊的事情。

import git 

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

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

a0x5cqrl

a0x5cqrl2#

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

of1yzvn4

of1yzvn43#

使用GitPython的公认答案比直接使用subprocess好不了多少。
这种方法的问题在于,如果您想要解析输出,那么您最终只能看到“cerine”命令which is a bad idea的结果
以这种方式使用GitPython就像得到了一个闪亮的新工具箱,然后用它来代替里面的工具,用螺丝钉把它固定在一起。下面是API的设计使用方式:

import git
repo = git.Repo('Path/to/repo')
repo.remotes.origin.pull()

如果要检查是否发生了更改,可以使用

current = repo.head.commit
repo.remotes.origin.pull()
if current != repo.head.commit:
    print("It changed")
qyuhtwio

qyuhtwio4#

如果你使用的是Python 3.5以上版本,那么对于它能处理的场景,你更喜欢subprocess.run而不是subprocess.Popen

import subprocess
subprocess.run(["git", "pull"], check=True, stdout=subprocess.PIPE).stdout
3yhwsihp

3yhwsihp5#

这是一个样本食谱,我一直在我的一个项目中使用。同意有多种方法来做到这一点虽然。:)

>>> 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的二进制文件,而需要执行第一个参数为pull的二进制文件git,依此类推。

busg9geu

busg9geu6#

试试看:

import subprocess
cwd = '/path/to/relevant/dir'
command = 'git pull'
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE, cwd=cwd)
output, unused_err = process.communicate()
print(output)
s3fp2yjn

s3fp2yjn7#

试试看:

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

相关问题