2011-06-22 201 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