2015-12-12 41 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

感謝您清理它一點。但我遇到的問題是,如果輸出不是通過尋呼機處理的,輸出中的控制字符將被解釋(例如,退格等),這是我想避免的,然後手動方式已經打破了輸入。 – max7

+0

@ max7:你手邊的方法意味着什麼會破壞輸入*? 'stdout'變量將得到'git -C ... |的**精確**輸出/ usr/bin/cat -vet'。這不是你想要的嗎? –

+0

當「git show」在沒有尋呼機的情況下運行時,輸出有時包含一個回車符(^ M),它將作爲執行回車符與殼互操作,當通過/將輸出管道傳輸給cat時,線仍然會被錯誤地拆分。當通過cat直接獲取git show輸出時,將會重新打印控制字符作爲文本^ M,而不是更合意。那有意義嗎? – max7