【发布时间】: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错误地解析你的命令行的风险)。