【问题标题】:Loss of color when executing git through python通过python执行git时失去颜色
【发布时间】:2014-02-28 03:41:04
【问题描述】:

我有以下 git 扩展脚本:

#!/usr/bin/env python

import sys
from subprocess import Popen, PIPE

if len(sys.argv) <= 1:
    sys.argv = sys.argv + ['status']

git_cmd = 'git ' + ' '.join(sys.argv[1:])

print('--->', git_cmd)

#p = Popen(['git'] + sys.argv[1:], shell=True, stdout=PIPE)
p = Popen(git_cmd, shell=True, stdout=PIPE)
out, err = p.communicate()

print(out)
#print(str(out).encode('ascii'))
#print(out.decode('ascii'))

基本上我想在一个变量中获取我的 Git 命令的输出,但我也希望它在变量中保留终端颜色代码。所以当我打电话给print(out) 时,它也应该打印颜色。目前,在调用communicate() 后返回给我的字符串没有颜色信息。如果我从Popen() 中删除stdout=PIPE,那么我确实会得到颜色,但输出会直接进入输出并且我没有在变量中得到它。

我通过 msysgit(不是 cmd.exe)在 Windows 上运行 Python 3.4 rc2。所以例如我会这样做:

git index status --short

它运行的命令是git status --short,输出不包含颜色信息,但是当我直接在msysgit终端运行相同的命令时,它给了我颜色。

有人知道我怎样才能找回颜色信息吗?

【问题讨论】:

  • 请注意,我给出的答案并未考虑任何可能存在/可能不存在的特定于 Windows 的行为。
  • 另外,使用git_cmd 字符串(这意味着shell=True)是错误的形式。传入一个显式参数数组,并且不要设置shell=True,如果你想要更好地定义的行为(你不会冒cmd.exe 错误地解析你的命令行的风险)。

标签: python windows git


【解决方案1】:

在您的 git 配置中将 color.ui 设置为 always。

请注意,这会破坏相当多的脚本(一般来说,不要期望颜色代码散布在他们从 git 子命令读取的内容中)。

要临时更新此设置,您可以在命令行中传递-c color.ui=always,或将GIT_CONFIG 环境变量设置为仅在脚本运行时指向具有此设置的配置文件。


或者,您可以停止使用stdout=PIPE,输出将直接发送到 TTY 而不是由您的程序捕获(这是明智的,因为您的程序除了打印之外什么都不做),并且 git 会着色默认情况下。

【讨论】:

  • 我的脚本还没有完成,但理想情况下,我计划在打印之前稍微改变一下输出。这就是我想要颜色的原因。
  • ...好吧,那么,这个答案的第一部分应该对你有用。当然,你的代码做变异工作需要知道如何处理终端代码。 (如果您曾经只针对 Windows,您可能只需要知道如何处理 ANSI 终端代码;如果您还针对其他平台,这会变得相当复杂)。
  • 您还可以在git 和实际命令之间添加一个-c color.ui=always 参数(或数组中的两个单独的字符串,如前所述,回避解析问题)。这可能比调整配置文件更容易。
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多