我正在使用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"
,即没有逃脱的字符串?从Bash运行命令很好:
$ git log -1 --pretty="format:%h %s"
4f14a66 basic debug page
答案 0 :(得分: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'
这也是我的重复问题的解决方案:Using sh, git show returns special characters - how to get plain output?
答案 1 :(得分:1)
s.stdout
不会打印它,而是显示其repr()
。使用print s.stdout
获取您要查找的内容。
如果您不想要任何转义码,请考虑使用subprocess.call()
执行它 - 如果stdout不是tty,则大多数程序不会输出任何转义序列。