在Python中使用os.execvp

7 投票
2 回答
12948 浏览
提问于 2025-04-11 09:33

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

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

当我用 " ".join(args) 输出一个字符串,并把它粘贴到我的命令行提示符中时,JVM(Java虚拟机)可以正常启动,一切都很好。如果我在我的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.

那么这是怎么回事呢?为什么复制/粘贴到命令行或者使用 os.system() 可以工作,但 os.execvp() 却不行呢?

2 个回答

0

确保你在类路径中没有依赖于 shell 扩展。比如说,"~/my.jar" 在使用 os.system 调用时会被 shell 扩展成你用户目录的完整路径,但我认为在 os.execvp 调用时不会这样处理。

11

如果你的 "classpath" 变量里面写的是 "-classpath foo.jar",那就不行,因为它会把这个选项当成一个整体来处理。你需要把它分成两个部分:[..., "-classpath", classpath, ...]。

其他的方法(比如复制粘贴和 system())之所以能用,是因为命令行在空格处会被分开(除非空格被转义或用引号包起来)。实际上,命令行会作为一个数组传递给被调用的程序(和 Windows 不一样),而 JVM 期待的是一个单独的元素 "-classpath",后面跟着另一个元素是 classpath。

你可以通过调用下面这个简单的 Python 脚本来亲自看看区别:

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

撰写回答