在蟒纹标准输出无壳转义序列(Print stdout in Python without shell

2019-07-04 05:08发布

我使用的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返回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 basic debug page"即没有逃逸的字符串? 从运行猛砸命令是罚款:

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

Answer 1:

s.stdout在REPL将不打印,但显示其repr() 使用print s.stdout让你在找什么。

如果你不希望任何转义码可以考虑使用执行它subprocess.call() -用不是一个tty大部分程序不输出任何转义序列标准输出。



Answer 2:

根据这个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'

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



文章来源: Print stdout in Python without shell escape sequences