没有shell转义序列的git show / log,用于python sh

时间:2013-11-21 12:58:16

标签: python git shell

我正在使用python的sh来编写git命令。例如,我做的事情是

import sh
git = sh.git.bake(_cwd='/some/dir/')

project_hash = git('rev-parse', 'HEAD').stdout.strip()
project_branch = git('rev-parse', '--abbrev-ref', 'HEAD').stdout.strip()
project_date = git('log', '-1', '--pretty=format:%ci').stdout.strip()

然后我将project_hash,project_branch和project_date写入数据库等。

问题是git有时会在其输出中添加shell转义序列。例如,

print(repr(project_hash))
print(repr(project_branch))
print(repr(project_date))

导致

'e55595222076bd90b29e184b6ff6ad66ec8c3a03'
'master'
'\x1b[?1h\x1b=\r2012-03-26 01:07:40 -0500\x1b[m\r\n\r\x1b[K\x1b[?1l\x1b>'

前两个字符串不是问题,但最后一个字符串是日期,它有转义序列。

有什么方法可以摆脱这些,例如要求git不输出任何转义序列?

我在git log命令中尝试了“--no-color”选项。这没有用。

我也很乐意在python中删除它们,但我不知道如何。我试过s.encode('ascii'),其中s是日期字符串。这没有什么区别。

Print stdout in Python without shell escape sequences解决了同样的问题。建议使用python的子进程而不是sh。例如,我可以做到

project_date = subprocess.check_output(["git", "log", "-1", "--pretty=format:%ci"], cwd='/some/dir/')

print(repr(project_date))

给出

'2012-03-26 01:07:40 -0500'

当然,这就是我想要的。但是,如果有可能我宁愿坚持使用sh,那么我想知道我是否可以使用sh来避免转义序列。

有什么建议吗?

2 个答案:

答案 0 :(得分:8)

那些不是颜色序列,它们看起来像终端初始化序列。具体做法是:

ESC [ ? 1 h ESC =

是打开功能键模式和

的序列
ESC [ ? 1 l ESC >

是再次关闭它的序列。这表明git log正在通过您的寻呼机运行。我不太清楚为什么;通常git在输出是一个管道时会抑制寻呼机的使用(至少与subprocess.Popen()一样)我想sh,虽然我没有使用sh模块

(暂停查阅文档......)

啊哈!默认情况下,每sh module docs sh - 模块运行命令的输出通过伪tty。这是愚弄运行寻呼机的麻烦。

作为稍微肮脏的变通方法,您可以运行git --no-pager log ...来禁止使用寻呼机,即使与sh一起运行也是如此。或者,您可以尝试_tty_out=False参数(再次,我没有使用sh模块,您将需要进行一些实验)。有趣的是,sh模块文档底部的一个例子是git!

答案 1 :(得分:0)

似乎sh做了正确的事。在python 2.7中,这个:

import sh
git = sh.git.bake(_cwd='/tmp/gittest/')

project_hash = git('rev-parse', 'HEAD')
project_branch = git('rev-parse', '--abbrev-ref', 'HEAD')
project_date = git('log', '-1', '--pretty=format:%ci')

print(repr(project_hash).strip())
print(repr(project_branch).strip())
print(repr(project_date).strip())

给了我:

500ddad67203badced9a67170b42228ffa269f53
master
2013-11-22 00:05:59 +1100

如果你真的想要去除转义,请使用python(Process escape sequences in a string in Python)提供的解码器工具