在Python中打印stdout而不使用shell转义序列

在Python中打印stdout而不使用shell转义序列,python,shell,escaping,sh,Python,Shell,Escaping,Sh,我使用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模板中使用它会给出基本调试页面[m[K[?1l>。我尝试使用repr()查看此字符串中的字符,但没有成功: In [4]: print repr(s) 4f14a6

我使用
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模板中使用它会给出基本调试页面[m[K[?1l>。我尝试使用
repr()
查看此字符串中的字符,但没有成功:

In [4]: print repr(s)
4f14a66 basic debug page
结果是
sh
中的命令返回一个
RunningCommand
,该命令具有
.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基本调试页”
,即没有转义的字符串?从Bash运行命令很好:

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

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

如果不需要任何转义代码,考虑使用<代码>子进程.Car()<代码>执行。

>>> 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'

这也是我重复问题的解决方案:

最终,我想在Django模板中使用输出。
print
理解转义序列,但如何剥离它们以获得普通字符串?啊..调用git log时是否尝试过
--no color
?遗憾的是,
没有更改--no color
子流程。检查\u output([“git”、“log”、“-1”、“--pretty=格式:%h%s]”)
工作正常,谢谢。