7

我有一个关于os.execvp在 Python 中使用的问题。我有以下用于创建参数列表的代码:

args = [“java”
       , 类路径
       , "-Djava.library.path=" + lib_path()
       , 一个
       , "-Xmx1000m"
       , “-服务器”
       , "code_swarm"
       , 参数
       ]

当我使用输出字符串" ".join(args)并将其粘贴到我的 shell 提示符中时,JVM 启动正常,一切正常。os.system(" ".join(args))如果我在我的 Python 脚本中使用,一切都会正常工作。

但是以下代码不起作用:

os.execvp("java", args)

我收到以下错误:

无法识别的选项:-classpath [然后是我创建的类路径,看起来还可以]
无法创建Java虚拟机。

那么给了什么?为什么复制/粘贴到外壳或使用os.system()工作,但不是os.execvp()

4

2 回答 2

11

如果您的“classpath”变量包含例如“-classpath foo.jar”,它将不起作用,因为它认为选项名称是“-classpath foo.jar”。将其拆分为两个参数:[..., "-classpath", classpath, ...]。

其他方式(复制和粘贴以及 system())之所以有效,是因为 shell 在空格处拆分命令行(除非它们被转义或引用)。命令行实际上是作为数组传递给被调用程序的(与 Windows 不同),JVM 希望找到一个只有“-classpath”的元素,然后是另一个具有类路径的元素。

您可以通过调用以下小型 Python 脚本而不是 JVM 来亲自查看差异:

#!/usr/bin/python
import sys
print sys.argv
于 2008-10-17T03:07:53.280 回答
0

确保您不依赖类路径中的 shell 扩展。例如,“~/my.jar”将在 os.system 调用中被 shell 扩展,但不是,我相信 os.execvp 调用。

于 2008-10-17T12:11:04.557 回答