Using os.execvp in Python

11,093

If your "classpath" variable contains for instance "-classpath foo.jar", it will not work, since it is thinking the option name is "-classpath foo.jar". Split it in two arguments: [..., "-classpath", classpath, ...].

The other ways (copy and paste and system()) work because the shell splits the command line at the spaces (unless they are escaped or quoted). The command line is in fact passed down to the called program as an array (unlike on Windows), and the JVM is expecting to find an element with only "-classpath" followed by another element with the classpath.

You can see the difference for yourself by calling the following small Python script instead of the JVM:

#!/usr/bin/python
import sys
print sys.argv
Share:
11,093
mipadi
Author by

mipadi

Just some guy, y'know? I write code for Industrial Light & Magic. I'm writing a book on Objective-C. Or rather, I was. Thanks to Apple, I'm now writing a book on Swift. You can check it out here. Oh, I also wrote a URL shortener for Stack Overflow profiles. Feel free to use it if you want!

Updated on June 11, 2022

Comments

  • mipadi
    mipadi almost 2 years

    I have a question about using os.execvp in Python. I have the following bit of code that's used to create a list of arguments:

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

    When I output a string using " ".join(args) and paste that into my shell prompt, the JVM launches fine, and everything works. Everything works if I use os.system(" ".join(args)) in my Python script, too.

    But the following bit of code does not work:

    os.execvp("java", args)

    I get the following error:

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

    So what gives? Why does copying/pasting into the shell or using os.system() work, but not os.execvp()?

  • John Millikin
    John Millikin over 15 years
    You can just use "print sys.argv", since str(list()) == repr (list())
  • CesarB
    CesarB over 15 years
    @John Millikin: Thanks, I removed the redundant repr().