在 Python 中打印标准输出,不带 shell 转义序列



我正在使用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中的命令返回具有.stdout属性的RunningCommand

In [5]: type(s)
Out[5]: sh.RunningCommand
In [7]: s.stdout
Out[7]: 'x1b[?1hx1b=r4f14a66 basic debug pagex1b[mrnrx1b[Kx1b[?1lx1b>'

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

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

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

>>> str(git('show', format='%cN', s=True))
'x1b[?1hx1b=rHonza Javorekx1b[mrnrx1b[Kx1b[?1lx1b>'
>>> str(git('show', format='%cN', s=True, _tty_out=False))
'Honza Javorekn'

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

REPL 中的s.stdout不会打印它,而是显示其repr()。使用print s.stdout来获取所需的内容。

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

最新更新