Frage

Ich habe eine Frage zu os.execvp in Python. Ich habe das folgende Stück Code, der eine Liste von Argumenten zu erstellen verwendet wird:

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

Wenn ich Ausgabe eine Zeichenfolge mit " ".join(args) und fügen Sie, dass in meiner Shell-Prompt, die JVM Fein startet, und alles funktioniert. Alles funktioniert, wenn ich os.system(" ".join(args)) in meinem Python-Skript verwenden, auch.

Aber der folgende Code funktioniert nicht:

os.execvp("java", args)

Ich erhalte den folgenden Fehler:

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

Also, was soll das? Warum Kopieren / Einfügen in die Schale oder mit os.system() Arbeit, aber nicht os.execvp()?

War es hilfreich?

Lösung

Wenn Sie Ihr „Classpath“ Variable zum Beispiel enthält „-classpath foo.jar“, wird es nicht funktionieren, da es die Option Namen denkt ist „-classpath foo.jar“. Spaltete es in zwei Argumente:. [... "-classpath", Classpath, ...]

Die anderen Möglichkeiten (kopieren und einfügen und ein System ()) Arbeit, da die Shell die Befehlszeile an die Räume teilt (es sei denn, sie entkommen sind oder zitiert). Die Kommandozeile ist in der Tat an das aufgerufene Programm als Array weitergegeben (anders als unter Windows), und die JVM erwartet mit einem Element finden nur „-classpath“, gefolgt von einem anderen Elemente mit dem Classpath.

Sie können den Unterschied selbst sehen, indem Sie den folgenden kleinen Python-Skript anstelle der JVM Aufruf:

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

Andere Tipps

Stellen Sie sicher, dass Sie nicht in Ihrem Classpath auf Shell-Erweiterung setzen. Z.B. "~ / My.jar" wird von dem Shell in einem os.system Aufruf erweitert, aber nicht, ich glaube, in einem os.execvp Anruf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top