2015-12-12 2 views
1

Я застрял в точке, где я не могу получить вызов подпроцесса python для «git show» для запуска через core.pager.Python subprocess.Popen для использования git pager

В моем ~/.gitconfig я указал основной пейджер;

[core] 
    pager = cat -vet 

И когда я запускаю это через подпроцесс (Popen или check_output)

cmd = ['git', '-C', repo, 'show', r'{0}:{1}'.format(commit, filename)] 
stdout = subprocess.check_output(cmd) 

Выход я не пробежать кот пейджера (линия закончится «$»)

Когда я запускаю его сам из cli, выход идет через пейджер. Как мне выполнить вызов подпроцесса, чтобы команда «git show» выполнялась через core.pager?

+0

Вместо 'subprocess.check_output', попробуйте его с помощью' subprocess.call'. – falsetru

+0

С вызовом я не смог бы захватить вывод команды, которая является требованием в этом случае, к сожалению – max7

ответ

1

AFAIK, git только постпроцессный выход через сконфигурированный пейджер, когда выход направлен на терминал. Поскольку вы используете subprocess.check_output, вывод команды git перенаправляется на канал (чтобы дать возможность его передать абоненту Python). Так как core.pager не вызывается.

Это вы хотите получить после обработки вывода, вам придется сделать это вручную

Предполагая, что вы хотите использовать cat -vet как фильтр постобработки, вы могли бы сделать:

cmd = ['git', '-C', repo, 'show', r'{0}:{1}'.format(commit, filename)] 
p1 = subprocess.Popen(cmd, stdout = subprocess.PIPE) 
filter = [ '/bin/cat', '-vet' ] 
p2 = subprocess.Popen(filter, stdout = subprocess.PIPE, stdin = p1.stdout) 
p2.wait() 
stdout = p2.stdout.read() 
+0

Спасибо, что немного расчистили ее. Проблема, которую я имею, состоит в том, что если вывод не обрабатывается через пейджер сначала, управляющие символы на выходе будут интерпретироваться (например, backspace и т. Д.), Чего я хочу избежать, а затем пошаговый подход уже сломал вход. – max7

+0

@ max7: Что вы подразумеваете под * под рукой подход будет сломанный вход уже *? Переменная 'stdout' получит ** точный ** вывод' git -C ... |/usr/bin/cat -vet'. Разве это не то, что вы хотите? –

+0

Когда «git show» работает без пейджера, на выходе иногда содержится возврат каретки (^ M), который будет передаваться оболочкой в ​​качестве возврата каретки привода и при передаче/обводке вывода на cat линия по-прежнему будет разбита неправильно , Когда вы получаете вывод git show непосредственно через cat, будет повторно печатать контрольный символ как текст^M, а это более желательно. Имеет ли это смысл? – max7