2011-06-22 399 views
3

我在Python 3中編寫了一個(有點)模塊化的應用程序,我想從它運行任意程序,所述程序在運行時指定,不一定是python腳本。用subprocess.call使用shebang執行python腳本

於是我就用例如

subprocess.call([spam, "-i", eggs, "-o", ham]) 

如果spam是一個Python腳本,用家當來python3和可執行的權利,我得到

OSError: [Errno 8] Exec format error 

如果我

subprocess.call(["python3", spam, "-i", eggs, "-o", ham]) 

它工作正常。

你知道爲什麼嗎?如何在沒有指定python3的情況下運行spam

+0

python腳本文件是否可執行? – jterrace

+0

是的,它是可執行的。 – Evpok

回答

8

您需要使用shell=True,你需要你的陣列將變成一個命令字符串,就像這樣:

subprocess.call(' '.join([spam, "-i", eggs, "-o", ham]), shell=True) 

這將調用外殼,而不是直接的命令,並且shell應該能夠處理shebang。

+0

不錯,它工作:)你知道爲什麼'call'不介意shebang嗎? – Evpok

+1

整改:將參數傳遞給'spam'需要編寫'subprocess.call(「」.join([spam,「-i」,eggs,「-o」,ham]),shell = True) '或者參數將被傳遞給shell,而不是腳本。見http://docs.python.org/dev/py3k/library/subprocess.html#using-the-subprocess-module – Evpok

+0

@Evpok:優秀的電話,我甚至沒有注意到。我會更新它。 –

-1

嘗試

subprocess.call(['spam.py', "-i", eggs, "-o", ham]) 
+0

它是'spam',而不是''spam「':一個變量而不是一個字符串。如您所建議的直接引用該腳本也不起作用。 – Evpok

+0

這篇文章沒有用,因爲它沒有回答原來的問題。上面的答案是使用'shell = True'。 – Klik