2008-10-17 25 views
6

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

 
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 startet in Ordnung, und alles funktioniert. Alles funktioniert, wenn ich auch os.system(" ".join(args)) in meinem Python-Skript verwende.

Aber das folgende Stück Code funktioniert nicht:

os.execvp("java", args)

ich die folgende Fehlermeldung erhalten:

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

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

Antwort

11

Wenn Ihre Variable "classpath" zum Beispiel "-classpath foo.jar" enthält, wird es nicht funktionieren, da der Name der Option "-classpath foo.jar" ist. Teilen Sie es in zwei Argumente auf: [..., "-classpath", classpath, ...].

Die anderen Möglichkeiten (Kopieren und Einfügen und System()) funktionieren, weil die Shell die Befehlszeile in den Leerzeichen aufteilt (sofern sie nicht maskiert oder zitiert werden). Die Befehlszeile wird tatsächlich (anders als unter Windows) als Array an das aufgerufene Programm übergeben, und die JVM erwartet ein Element mit nur "-classpath", gefolgt von einem anderen Element mit dem Klassenpfad.

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 
+0

Sie können einfach "print sys.argv" verwenden, da str (list()) == repr (list()) –

+0

@John Millikin: Danke, ich habe die redundante repr() entfernt. – CesarB

0

sicher, dass Sie nicht in Ihrem Classpath auf Shell-Erweiterung setzen. Z.B. "~/my.jar" wird durch die Shell in einem os.system-Aufruf erweitert, aber ich glaube nicht an einen os.execvp-Aufruf.

Verwandte Themen