Python subprocess.Popen 使用 git pager

标签 python git subprocess pager

我陷入了无法通过 core.pager 运行“git show”的 python 子进程调用的困境。

在我的 ~/.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 寻呼机(这些行将以“$”结尾)

当我自己从 cli 运行它时,输出确实通过寻呼机。 我应该如何调用子进程来让“git show”命令通过 core.pager 运行?

最佳答案

据我所知,当输出定向到终端时,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()

关于Python subprocess.Popen 使用 git pager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34241422/

相关文章:

python - 验证和异常与错误消息元组

python - 多行字符串的缩进

python - BeautifulSoup 获取给定元素之外的文本

git - 通过命令行在 Git 提交消息中使用撇号(单引号)

git - 如何在从钩子(Hook)/接收后 checkout 时设置 git 文件的所有者和组?

python - 使用 python 子进程获取硬件 id 时出错

python - __init__() 在 python 子进程中得到了一个意外的关键字参数 'timeout'

python - 缓存磁盘操作

git - 使用 git rebase -i 重新排序提交时出错

python - 如何检查子进程的 Popen 是否抛出错误