Question

J'ai une question sur l'utilisation de os.execvp en Python. J'ai le code de code suivant utilisé pour créer une liste d'arguments:

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

Lorsque je produis une chaîne à l'aide de " " .join (args) et collez-le dans mon invite de shell, la machine virtuelle Java démarre correctement et tout fonctionne. Tout fonctionne si j'utilise os.system (".join (args)) dans mon script Python également.

Mais le bit de code suivant ne fonctionne pas:

os.execvp("java", args)

J'obtiens l'erreur suivante:

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

Alors qu'est-ce qui donne? Pourquoi copier / coller dans le shell ou utiliser os.system () , mais pas os.execvp () ?

Était-ce utile?

La solution

Si votre " classpath " La variable contient par exemple "-classpath foo.jar", elle ne fonctionnera pas, car elle pense que le nom de l'option est "-classpath foo.jar". Divisez-le en deux arguments: [..., "-classpath", classpath, ...].

Les autres méthodes (copier-coller et system ()) fonctionnent parce que le shell divise la ligne de commande au niveau des espaces (sauf si elles sont échappées ou entre guillemets). La ligne de commande est en fait transmise au programme appelé sous forme de tableau (contrairement à Windows), et la machine virtuelle Java s'attend à trouver un élément avec uniquement "-classpath". suivi d'un autre élément avec le classpath.

Vous pouvez constater la différence en appelant le petit script Python suivant à la place de la machine virtuelle Java:

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

Autres conseils

Assurez-vous de ne pas compter sur l’extension du shell dans votre chemin de classe. Par exemple. " ~ / my.jar " sera développé par le shell dans un appel os.system, mais pas, je crois en un appel os.execvp.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top