Python子进程" git gc" stderr未被捕获

时间:2016-04-28 14:57:52

标签: python git subprocess

这是我观察到的行为:

>>> out = subprocess.check_output("git gc", shell=True)
Counting objects: 4869, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (1219/1219), done.
Writing objects: 100% (4869/4869), done.
Total 4869 (delta 3607), reused 4869 (delta 3607)

操作输出打印在STDERR中。我想在变量中捕获这个,所以我将stderr发送到STDOUT。但它没有抓住它。

>>> out = subprocess.check_output("git gc", shell=True, stderr=subprocess.STDOUT)
>>> out
b''
>>> print(out)
b''

有任何想法/建议吗?

似乎CFN AWS::DynamoDB::Table documentation是一种特殊情况,无法进行输出重定向。在另一个问题中建议使用打字稿,但是有更多知识的人可以解释这种行为吗?脚本方法不起作用,因为它没有退出分支。

2 个答案:

答案 0 :(得分:1)

git gc真的是一个特例,请看这里: Trying to redirect 'git gc' output
尝试使用git status查看差异。

更新

问题是一个很好的挑战。一位同事查看了GIT的源代码,发现如果进程没有在后台启动,git gc只会写入stdout。经过一番搜索后,我遇到了pty library,受到https://stackoverflow.com/a/6953572/2776376的启发,找到了一个有效的解决方案。
以下代码捕获了stdout的{​​{1}},尽管它必须被写入文件。

git gc

答案 1 :(得分:0)

git gc may change its behavior depending whether its standard input/output/error streams are connected to a terminal or not (whether it thinks, it is run interactively or not)。如果你想要像在终端中运行它一样输出相同的输出;您可以使用伪tty(似乎没有命令行选项可以为git gc配置所需的输出行为:--quiet不接受参数,例如,与apt-get一样1}}):

#!/usr/bin/env python
import pexpect # $ pip install pexpect

output, exitstatus = pexpect.run('git gc', withexitstatus=1)

基于pty的解决方案的相关问题: