2011-09-13 77 views
4

我想用python子進程模塊使用subhells和重定向的魔力,但它似乎不起作用,抱怨意外的令牌是括號。例如,當傳遞到子命令Python子進程,子殼和重定向

cat <(head tmp)

給出了這樣的

>>> subprocess.Popen("cat <(head tmp)", shell=True) 
<subprocess.Popen object at 0x2b9bfef30350> 
>>> /bin/sh: -c: line 0: syntax error near unexpected token `(' 
/bin/sh: -c: line 0: `cat <(head tmp)' 
+1

公告你的錯誤來自'/ bin/sh'。我認爲這種語法只能在'bash'中使用。你想讓子進程運行'bash'嗎?這是個問題嗎? –

+0

@ S.Lott我認爲在我的安裝中,sh是bash。當然,如果我做了「man sh」,那麼出現的man page就是bash。 Scott Lamb指出,當被調用爲'sh'時,這個功能是不可用的,所以從某種意義上說,是的,我希望它運行爲'bash',即使我認爲它已經是。 –

+0

爲什麼當Python能夠做你想做的事情時,你會向殼體提出要求? –

回答

10

<(head tmp)語法是所謂的 「處理取代」 一個bash特徵。基本/便攜式/bin/sh不支持它。 (這是即使在哪裏/bin/sh/bin/bash是相同的程序系統,真實的;它不允許此功能時,作爲純/bin/sh調用,所以你不會無意中依賴於非便攜功能。)

>>> subprocess.Popen(["/bin/bash", "-c", "cat <(head tmp)"]) 
<subprocess.Popen object at 0x1004cca50>