【问题标题】:Why CalledProcessError during subprocess.check_output(['cmd', 'arg'])为什么在 subprocess.check_output(['cmd', 'arg']) 期间出现 CalledProcessError
【发布时间】:2013-06-08 13:19:20
【问题描述】:

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

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

但是,我收到如下错误:

Command '['git', 'pull', 'origin', 'mybranch']' returned non-zero exit status 128

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

【问题讨论】:

  • 会不会是import os;print(os.getcwd())(= 当前工作目录)不在 git 存储库中?
  • 用户在 git repo 中
  • git 命令的输出是什么?
  • 可能你的路径变量不包含 git 命令。 Git 也可能会丢失您的 .ssh 设置/访问资源所需的密钥。

标签: python django subprocess


【解决方案1】:

我无法重现这一点,因为该命令在 shell 中也适用于我,但在 Apache+mod_wsgi 下运行时添加 shell=True 可能会修复它

【讨论】:

  • shell=True 没有解决这个问题。我怀疑这是用户权限问题。调用url时,脚本由www-data用户运行
  • @Elisa 谁拥有该目录?在 Apache 下运行时当前的工作目录是什么?您真的想从 Web 服务器进行系统调用吗?
  • 我没有考虑权限,而是缺少 ENV 变量。 GitPython 值得一看 pythonhosted.org/GitPython/0.3.1/tutorial.html,尽管您可能会遇到同样的问题
  • @AlexChamberlain 目录自己的用户 abcd,我用来登录到 ubuntu 机器。从 python shell 和 web 运行时,路径是相同的。是的,我正在从 Web 服务器调用系统调用。
  • @igniteflow 我提供了像 /usr/bin/git 这样的完整路径,但它仍然不起作用
【解决方案2】:

我用 git grep 两次遇到同样的问题。

第二次是因为我忘记将www-data 添加到对 git 存储库文件夹具有读取权限的组中。

另外,由于 git 命令需要从 git repo 中运行,您可能想尝试在参数列表中添加 '--git-dir=''--work-tree=',就在 git main 命令之后:

   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)

如果您的 cwd 与您的 repo_path 不同,则需要它。

【讨论】:

    猜你喜欢
    • 2020-12-05
    • 1970-01-01
    • 2015-06-27
    • 2012-11-10
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2022-08-12
    相关资源
    最近更新 更多