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 () ?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top