2008-10-17 18 views
6

Mam pytanie dotyczące używania os.execvp w języku Python. Mam następujący fragment kodu, który jest używany do utworzenia listy argumentów:Korzystanie z narzędzia os.execvp w języku Python

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

Kiedy wyjście ciąg używając " ".join(args) i wklej to do moich poleceń powłoki, JVM uruchamia grzywny, i wszystko działa. Wszystko działa, jeśli używam również os.system(" ".join(args)) w moim skrypcie Pythona.

Ale następujący fragment kodu nie działa:

os.execvp("java", args)

pojawia się następujący błąd:

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

Więc co się dzieje? Dlaczego kopiowanie/wklejanie do powłoki lub używanie os.system() działa, ale nie działa?

Odpowiedz

11

Jeśli zmienna "classpath" zawiera na przykład "-classpath foo.jar", nie będzie działać, ponieważ uważa, że ​​nazwa opcji to "-classpath foo.jar". Podziel go na dwa argumenty: [..., "-classpath", classpath, ...].

Inne sposoby (skopiuj i wklej oraz system()) działać, ponieważ skorupa pęka wiersza polecenia w przestrzeni (o ile nie są one notowane lub uciekł). Wiersz poleceń jest przekazywany do wywoływanego programu jako tablica (inaczej niż w Windows), a JVM spodziewa się znaleźć element z tylko "-classpath", po której następuje inny element ze ścieżką klasy.

Widać różnicę dla siebie wywołując następujące mały skrypt Pythona zamiast JVM:

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

Możesz po prostu użyć "print sys.argv", ponieważ str (list()) == repr (list()) –

+0

@John Millikin: Dzięki, usunąłem redundantny repr(). – CesarB

0

Upewnij się, że opierając się na rozszerzenie powłoki w ścieżce klas. Na przykład. "~/my.jar" zostanie rozszerzone przez powłokę w wywołaniu os.system, ale nie, wierzę w wywołanie os.execvp.

Powiązane problemy