1

我在 Git 存储库上运行 Gitolite,我在那里有 post-receive 钩子。这个钩子的脚本是用 Python 编写的,之后失败了

proc = subprocess.Popen('git log', shell = True, stdout=subprocess.PIPE)
out = proc.stdout.read()

在这些行之后它不会执行。如果我手动运行此脚本,它会完美运行。

我做错了什么?

4

2 回答 2

1

子流程文档

警告

使用communicate() 而不是.stdin.write、.stdout.read 或.stderr.read 以避免由于任何其他OS 管道缓冲区填满并阻塞子进程而导致的死锁。

如果可能的话,我也会避免使用shell=True(IMO 只有在你想使用 shell 内置函数并且它是特定于平台/shell 时才有用),并将 Popen 命令作为列表传递,比如['git', 'log']

尝试类似:

>>> proc = subprocess.Popen(['git', 'log'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> proc.communicate()
('', 'fatal: Not a git repository (or any of the parent directories): .git\n')

communicate()[0]是标准输出,communicate()[1]是标准错误。

于 2012-06-06T15:04:26.310 回答
0

您的管道可能不会返回。如果是这种情况,您可以:

  1. 运行带有--no-pager标志的 git 以防止您的 PAGER 或 GIT_PAGER 挂起该进程。

  2. 使用标志限制您的日志输出,-n以将管道输出保持在合理的大小。子流程库明确表示:

    [T] 如果子进程生成足够的输出到管道以填满操作系统管道缓冲区,则子进程可能会阻塞。

于 2012-06-06T15:05:26.923 回答