2017-05-09 41 views
1

任何想法爲什麼我作爲我的命令傳遞給subprocess()的列表不能正確擴展?Python - subprocess cmd列表不能正確擴展

file_name = "some_make_file" 
cmd = ['gmake', '-pn', '-f', file_name, '|', 'grep', '-A1', '"^# makefile"', '|', 'grep', '-v', '"^#\|^--"', '|', 'sort', '|', 'uniq'] 
proc = Popen(cmd, stdout=PIPE, stderr=PIPE) 
stdout, stderr = prod.communicate() 

輸出是使用gmake錯誤,如果我加盟CMD,以測試它的CMD線嘍,我得到這個:

#join 
" ".join(cmd) 

#output 
('gmake -pn -f some_make_file | grep -A1 "^ makefile" | grep -v ' 
'"^#\\|^--" | sort | uniq') 

因爲如果我,我似乎無法生活找出這個命令有什麼問題。有任何想法嗎?我沒有正確地逃避什麼嗎?添加一個特殊的字符而沒有意識到它?

+0

實際的命令是否按照提供的方式運行?嘗試執行聯合命令時,shell會顯示什麼錯誤? –

+0

該命令按照提供的方式運行,這就是爲什麼我試圖加入列表來測試實際傳遞給subprocess.Popen()的內容的原因。問題在於該列表以某種方式改變了命令。輸出是一個gmake錯誤消息。 – user797963

+0

不,問題在於您將管道角色作爲參數傳遞給gmake,而不是創建shell管道。可以使用'shell = True'或者(最好)使用['pipes'](https://docs.python.org/3/library/pipes.html)。甚至可以用bash或zsh而不是Python編寫你的shell腳本。 – Kevin

回答

0

您沒有運行中間shell,因此沒有任何內容可以解釋|作爲管道命令。即使你設置shell = True,因爲你傳入了一個列表,它會被轉義。管道的正確方法在官方python文檔中給出- tdelaney