Utiliser os.execvp en Python
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 ()
?
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.