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

args = [ "java"
       , classpath
       , "-Djava.library.path=" + lib_path()
       , ea
       , "-Xmx1000m"
       , "-server"
       , "code_swarm"
       , params
       ]

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

但是以下代码不起作用:

os.execvp("java", args)

我收到以下错误:

Unrecognized option: -classpath [and then the classpath I created, which looks okay]
Could not create the Java virtual machine.

那是什么给出的?为什么复制/粘贴到shell或使用 os.system()工作,而不是 os.execvp()

有帮助吗?

解决方案

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

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

通过调用以下小型Python脚本而不是JVM,您可以看到自己的不同之处:

#!/usr/bin/python
import sys
print sys.argv

其他提示

确保您不依赖于类路径中的shell扩展。例如。 "〜/ my.jar"将在os.system调用中通过shell扩展,但不是,我相信os.execvp调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top