2012-11-28 1 views
2

Я использую sh для запуска команд git внутри сценария Python.Печать stdout в Python без escape-последовательностей оболочки

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 

ответ

1

s.stdout в РЕПЛ не будет печатать, но отображать его repr(). Используйте print s.stdout, чтобы получить то, что ищете.

Если вы не хотите, чтобы какие-либо escape-коды рассматривали возможность его выполнения с помощью subprocess.call() - поскольку stdout не является tty, большинство программ не выводят никаких управляющих последовательностей.

+0

В конце концов, я хочу использовать выход в шаблоне Django , 'print' понимает escape-последовательности, но как это сделать, чтобы получить простую строку? –

+0

А .. Вы пытались «-no-color» при вызове git-log? – ThiefMaster

+0

Без изменений с '--no-color' печально. –

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?

+0

@Wilfred это должен быть принятый ответ! – ead