我怎样才能在Python中调用'git pull'?

使用github webhooks,我希望能够将任何更改提供给远程开发服务器。 目前,当在适当的目录中, git pull会得到所需的任何更改。 不过,我不知道如何从Python中调用该函数。 我已经尝试了以下内容:

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

但是这会导致以下错误

Traceback(最近调用的最后一个):File“”,第1行,位于File“/usr/lib/python2.7/subprocess.py”,第679行,在init errread,errwrite)File“/ usr / lib / python2。 7 / subprocess.py“,行1249,在_execute_child引发child_exception OSError:[Errno 2]没有这样的文件或目录

有没有一种方法可以在Python中调用这个bash命令?

你有没有考虑过使用GitPython? 它旨在为你处理所有这些废话。

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

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

subprocess.Popen需要一个程序名和参数列表。 你传递一个单一的string,它是(默认的shell=False )相当于:

 ['git pull'] 

这意味着subprocess试图find一个名为literally 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"]) 

另外,为了使用gitfunction,调用git二进制文件是没有必要的(尽pipe简单和便携)。 考虑使用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二进制文件。 相反,它需要执行第一个参数是pull的二进制git等等。

尝试:

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