簡體   English   中英

在沒有 shell 轉義序列的 Python 中打印標准輸出

[英]Print stdout in Python without shell escape sequences

我正在使用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

根據 這個 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 show 返回特殊字符 - 如何獲得純輸出?

REPL 中的s.stdout不會打印它,而是顯示它的repr() 使用print s.stdout獲取您要查找的內容。

如果您不想要任何轉義碼,請考慮使用subprocess.call()執行它 - stdout 不是 tty 大多數程序不輸出任何轉義序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM