退出状态为 128 的子进程调用

新手上路,请多包涵

本质上,我正在尝试使用子进程调用来检出特定 sha 哈希的 git 提交。

但是,我不断收到错误 subprocess.CalledProcessError: Command '['git', 'checkout', '62bbce43e']' returned non-zero exit status 128.

这是我的代码如下:

 with open(filename) as inputfile:
    reader = csv.reader(inputfile, delimiter=",")
    linecount = 0
    for row in reader:
        if linecount == 0:
            linecount += 1
        else:
            repo = str(row[0])
            sha = str(row[2])
            specificfile = str(row[3])
            linenum = int(row[4])
            cl("cd", repo)
            subprocess.check_output(['git', 'checkout', sha])
            print("checkout done")
            git("checkout", "-")

原文由 paulo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

subprocess.check_output() 调用实际上返回输出(您也可以通过传递 stderr 参数来获得错误输出)。你可能想看看它是否给你一个错误来解释发生的事情。

由于您遇到异常(意味着调用未完成,因此可能不会返回输出),您应该能够从异常成员之一获取输出:

 try:
    output = subprocess.check_output(['git', 'checkout', sha], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print("Exception on process, rc=", e.returncode, "output=", e.output)

知道的一件事是一些 git 如果您实际上 不在 Git 存储库中,命令往往会返回 128。因此,我将查看您的 cl("cd", repo) 行之后的路径,其中:

 os.system("pwd")  # use "cd" for Windows.

如果你的那个 cd子进程中运行,不会 影响当前进程,因此你可能根本不一定在 Git 存储库中。这肯定会解释 128 返回码。

例如,以下记录显示了当我尝试在存储库之外运行 git 命令时发生的情况:

 >>> try:
...     output = subprocess.check_output(['git', 'checkout', '12345'])
... except subprocess.CalledProcessError as e:
...     print(e.returncode, e.output)
...

128 b'fatal: not a git repository (or any of the parent directories): .git\n'

如果发现你 错误的目录中(即 cl("cd", repo) 语句正在运行一个子进程来更改目录),你应该使用 Python-blessed 方法来更改目录(a) :

 import os
os.chdir(path)

这实际上更改了 直接 进程(Python 解释器)的目录,而不是临时子进程。


(a)这实际上是一般的好建议——尽可能多地使用特定于 Python 的东西(因为它主要是跨平台的)而不是产生一个子 shell(它本质上是特定于平台的)。

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 4.0 许可协议

对我来说,从 inside the git repo 运行程序解决了这个问题。

原文由 Mohit Gaikwad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题