我怎样才能在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()
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)