使用shebang在subprocess.call中执行Python脚本

3

我正在使用Python 3编写一个(有点)模块化的应用程序,希望能够从中运行任意程序,该程序在运行时指定,不一定是Python脚本。

例如,我可以使用以下代码:

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

如果spam是一个带有shebang到python3和可执行权限的python脚本,我会得到
OSError: [Errno 8] Exec format error

如果我

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

它运行良好。

你知道为什么吗?我如何在不指定 python3 的情况下运行 spam


Python腳本文件是否可執行? - jterrace
2个回答

8

您需要使用shell=True,并将数组转换为命令字符串,如下所示:

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

这将调用shell而不是直接命令,shell应该能够处理shebang。

很好,它有效了 :) 你知道为什么 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
@Evpok:非常好的提醒,我甚至没有注意到。我会进行更新。 - Chris Eberle
很抱歉,我不知道为什么单独使用subprocess似乎无法执行以shebang开头的脚本。 - Chris Eberle
维基百科说execve应该处理它,我在源代码中检查了一下,确实是这样使用的,所以要么维基百科是错的,要么有些奇怪的事情发生了。 - Lennart Regebro
显示剩余2条评论

-2

尝试

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

这是一个变量 spam,不是一个字符串 "spam"。直接引用脚本也不起作用。 - Evpok
这篇文章并不有用,因为它没有回答原始问题。答案已经在上面提到了,就是使用 shell=True - Klik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接