当前位置: 首页 > 面试题库 >

git show / log,不带外壳转义序列,用于python sh

邢高爽
2023-03-14
问题内容

我正在使用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是日期字符串。那并没有改变。

没有外壳转义序列的Python中的标准输出解决了相同的问题。推荐使用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进行转义序列。

有什么建议?


问题答案:

这些不是颜色序列,看起来像终端初始化序列。特别:

ESC [ ? 1 h ESC =

是打开功能键模式的顺序,

ESC [ ? 1 l ESC >

是再次将其关闭的顺序。这表明git log正在通过寻呼机运行。我不太清楚为什么。通常,当输出是管道时,git会抑制对分页器的使用(subprocess.Popen()至少与它一样sh,尽管我没有使用过该sh模块,但我会考虑with
)。

(暂停查阅文档…)

啊哈!根据sh sh模块文档,默认情况下,sh-module-
run命令的输出通过伪tty。这是在欺骗git运行您的寻呼机。

作为一种较脏的解决方法git --no-pager log ...,即使使用,您也可以禁止使用寻呼机sh。或者,您可以尝试使用该_tty_out=False参数(再次,我没有使用过sh模块,您将不得不进行一些实验)。有趣的是,sh模块文档底部的示例之一是git!



 类似资料:
  • 问题内容: 我用来在Python脚本中运行git命令。 这似乎按预期工作。但是,在Django模板中使用会给出。我尝试使用来查看此字符串中的字符,但无济于事: 事实证明,返回的命令具有属性: 如何获取没有转义符的字符串?从Bash运行命令很好: 问题答案: 在REPL中将不会打印它,而是显示它。使用让你在找什么。 如果您不希望使用任何转义代码,请考虑使用-在stdout不是tty的情况下执行它,大

  • 我需要有关switch的帮助,这是我需要帮助的代码部分。 在P之后的下一种情况下,我如何才能得到一个“回车”键。我想要的是,如果用户只按了回车键,那么程序将播放另一个回合。我在考虑做字符串。valueOf(kb.nextLine())但这不起作用。 谢谢你的帮助。

  • 问题内容: 我想用“ +”替换字符串中的所有空白字符,并用“ ss”替换所有“ß” …它对于“ß”效果很好,但是以某种方式,eclipse不允许我将\ s用作空白。 。我改用“ \ t”,但也不起作用。.我收到以下错误: 无效的转义序列(有效的是\ b \ t \ n \ f \ r \“ '\) 这是我的代码: 为什么不起作用?android,eclipse或其他问题吗? 提前致谢! 问题答案:

  • 我正在Android上使用Moshi 1.8.0,并按照Moshi文档中的说明创建自定义字段:https://github.com/square/Moshi#custom-field-names-with-json 这意味着我的请求数据类是这样的: 但问题是实际的HTTP请求是这样发送的: 我所期待的是我的请求是这样的: 这似乎对响应工作得很好,但我不知道如何使它对请求工作。 谢谢!这难道不是注释

  • 我试图在Java中通过PreparedStatement调用SQL时实现jdbc转义序列。

  • 问题内容: 只是一个简单的问题: 如何清除外壳中的屏幕?我见过类似的方式: 这只是打开Windows cmd,清除屏幕并关闭,但是我希望清除外壳窗口 (PS:我不知道这有帮助,但是我使用的是Python 3.3.2版) 谢谢:) 问题答案: 对于macOS / OS X,您可以使用子进程模块并从外壳程序中调用“ cls”: 为了防止在窗口顶部显示“ 0”,请用以下内容替换第二行: 对于Linux,