Utilizzo di os.execvp in Python
Domanda
Ho una domanda sull'uso di os.execvp
in Python. Ho il seguente bit di codice che viene utilizzato per creare un elenco di argomenti:
args = [ "java" , classpath , "-Djava.library.path=" + lib_path() , ea , "-Xmx1000m" , "-server" , "code_swarm" , params ]
Quando emetto una stringa usando " " .join (args)
e incollalo nel mio prompt della shell, la JVM si avvia bene e tutto funziona. Tutto funziona se uso os.system (" " .join (args))
anche nel mio script Python.
Ma il seguente bit di codice non funziona:
os.execvp("java", args)
Ottengo il seguente errore:
Unrecognized option: -classpath [and then the classpath I created, which looks okay] Could not create the Java virtual machine.
Quindi cosa dà? Perché copiare / incollare nella shell o usare os.system ()
ma non os.execvp ()
?
Soluzione
Se il tuo " classpath " la variabile contiene ad esempio " -classpath foo.jar " ;, non funzionerà, poiché pensa che il nome dell'opzione sia " -classpath foo.jar " ;. Dividilo in due argomenti: [..., " -classpath " ;, classpath, ...].
Gli altri modi (copia e incolla e system ()) funzionano perché la shell divide la riga di comando negli spazi (a meno che non siano salvati o citati). La riga di comando viene infatti passata al programma chiamato come un array (a differenza di Windows) e la JVM si aspetta di trovare un elemento con solo " -classpath " seguito da un altro elemento con il percorso di classe.
Puoi vedere la differenza da solo chiamando il seguente piccolo script Python anziché JVM:
#!/usr/bin/python
import sys
print sys.argv
Altri suggerimenti
Assicurati di non fare affidamento sull'espansione della shell nel tuo percorso di classe. Per esempio. & Quot; ~ / my.jar " verrà espanso dalla shell in una chiamata os.system, ma non credo in una chiamata os.execvp.