为什么在使用subprocess.check_output(['cmd', 'arg'])时会出现CalledProcessError错误?

5

我有一个使用Apache+mod_wsgi托管的Django项目。我正在尝试使用子进程通过git命令拉取更新,例如:

subprocess.check_output(['git', 'pull', 'origin', 'mybranch']) 

然而,我遇到了如下错误:
Command '['git', 'pull', 'origin', 'mybranch']' returned non-zero exit status 128

当我通过浏览器调用此函数时,出现了这个问题。如果我从python shell运行subprocess.check_output(['git', 'pull', 'origin', 'mybranch']),就不会有错误。它按预期的完美运行。


可能是因为import os;print(os.getcwd())(即当前工作目录)不在Git存储库中? - User
用户它在 Git 仓库中。 - Elisa
git命令的输出是什么? - User
也许你的路径变量中没有包含git命令。Git也可能会丢失你的.ssh设置/访问资源所需的密钥。 - User
2个回答

1

我两次使用git grep时都遇到了同样的问题。

第二次出现这个问题是因为我忘记将www-data添加到具有git仓库文件夹读取权限的组中。

此外,由于git命令需要在git仓库内运行,您可能想尝试在参数列表中在git主命令之后添加'--git-dir=''--work-tree='

   gd = '--git-dir=' + os.path.join(repo_path, '.git')
   wt = '--work-tree=' + repo_path
   gg_matches = subprocess.check_output(["git", gd, wt, "grep"] + gg_opt)

如果您的当前工作目录与存储库路径不同,这是必需的。

0

我无法复现此问题,因为该命令在我的shell中也可以运行,但在Apache+mod_wsgi下运行时添加shell=True可能会修复它。


1
shell=True并没有解决这个问题。我怀疑这是用户权限问题。在调用URL时,脚本是由www-data用户运行的。 - Elisa
1
@Elisa 谁拥有该目录?在 Apache 下运行时,当前工作目录是什么?您真的想从 Web 服务器中进行系统调用吗? - Alex Chamberlain
我没有考虑权限,而是缺少环境变量。GitPython可能值得一看,网址为http://pythonhosted.org/GitPython/0.3.1/tutorial.html,尽管您可能会遇到相同的问题。 - igniteflow
@AlexChamberlain 目录的所有者用户是abcd,我用它登录到Ubuntu机器。无论是从Python shell还是Web运行时,路径都是相同的。是的,我正在从Web服务器调用系统调用。 - Elisa
@igniteflow,我已经提供完整路径,例如/usr/bin/git,但仍然无法工作。 - Elisa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接