2

sh用来在 Python 脚本中运行 git 命令。

In [1]: from sh import git

In [2]: s = git("log", "-1", pretty="format:%h %s")

In [3]: print s
4f14a66 basic debug page

这似乎按预期工作。但是,在 Django 模板中使用它会给出[?1h= 4f14a66 basic debug page[m [K[?1l>. 我尝试使用 来查看此字符串中的字符repr(),但无济于事:

In [4]: print repr(s)
4f14a66 basic debug page

结果sh返回的命令 aRunningCommand具有一个.stdout属性:

In [5]: type(s)
Out[5]: sh.RunningCommand

In [7]: s.stdout
Out[7]: '\x1b[?1h\x1b=\r4f14a66 basic debug page\x1b[m\r\n\r\x1b[K\x1b[?1l\x1b>'

我如何得到"4f14a66 basic debug page"没有转义的字符串?从 Bash 运行命令很好:

$ git log -1 --pretty="format:%h %s"
4f14a66 basic debug page
4

2 回答 2

5

根据this GitHub issue,该问题的正确解决方案是使用_tty_out=False

>>> str(git('show', format='%cN', s=True))
'\x1b[?1h\x1b=\rHonza Javorek\x1b[m\r\n\r\x1b[K\x1b[?1l\x1b>'

>>> str(git('show', format='%cN', s=True, _tty_out=False))
'Honza Javorek\n'

这也是我重复问题的解决方案:使用 sh,git show 返回特殊字符 - 如何获得纯输出?

于 2016-03-27T20:15:39.610 回答
1

s.stdout在 REPL 中不会打印它,而是显示它的repr(). 用于print s.stdout获取您要查找的内容。

如果您不想要任何转义码,请考虑使用subprocess.call()- 执行它,而 stdout 不是 tty 大多数程序不输出任何转义序列。

于 2012-11-28T17:36:21.190 回答