在Python中使用os.execvp
我有一个关于在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