在没有shell转义序列的情况下在Python中打印stdout

Wil*_*hes 2 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
Run Code Online (Sandbox Code Playgroud)

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

In [4]: print repr(s)
4f14a66 basic debug page
Run Code Online (Sandbox Code Playgroud)

事实证明,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>'
Run Code Online (Sandbox Code Playgroud)

我怎么得到"4f14a66 basic debug page"没有逃脱的字符串?从Bash运行命令很好:

$ git log -1 --pretty="format:%h %s"
4f14a66 basic debug page
Run Code Online (Sandbox Code Playgroud)

Hon*_*rek 5

根据这个GitHub问题,正确解决问题的方法是使用_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'
Run Code Online (Sandbox Code Playgroud)

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