Python subprocess.Popen使用git pager

时间:2015-12-12 15:16:11

标签: python git subprocess pager

我已经陷入了无法通过" git show"来获取我的python子流程调用的地步。运行core.pager。

在我的〜/ .gitconfig中,我指定了一个核心寻呼机;

[core]
    pager = cat -vet

当我通过子进程(Popen或check_output)

运行时
cmd = ['git', '-C', repo, 'show', r'{0}:{1}'.format(commit, filename)]
stdout = subprocess.check_output(cmd)

我得到的输出没有通过cat pager(行以' $'结束)

当我自己从cli运行它时,输出会通过寻呼机。 我该如何调用subprocess来获得" git show"命令运行core.pager?

1 个答案:

答案 0 :(得分:2)

AFAIK,git仅在输出定向到终端时通过配置的寻呼机进行后处理输出。当您使用subprocess.check_output时,git命令的输出将重定向到管道(以允许将其提供给Python调用者)。因此不会调用core.pager

您希望获得后处理输出,您必须手动

假设您想使用cat -vet作为后期处理过滤器,您可以执行以下操作:

cmd = ['git', '-C', repo, 'show', r'{0}:{1}'.format(commit, filename)]
p1 = subprocess.Popen(cmd, stdout = subprocess.PIPE)
filter = [ '/bin/cat', '-vet' ]
p2 = subprocess.Popen(filter, stdout = subprocess.PIPE, stdin = p1.stdout)
p2.wait()
stdout = p2.stdout.read()