2008-10-17 9 views
6

Python'da os.execvp kullanımı hakkında bir sorum var.Python'da os.execvp kullanımı

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

Ben çıkışı bir dize " ".join(args) kullanarak ve benim kabuk istemi içine yapıştırın JVM ince başlattı ve her şey çalışıyor: Ben bağımsız değişkenlerin bir listesini oluşturmak için kullanılan kodun aşağıdaki bit var. Python betiğimde de os.system(" ".join(args)) kullanırsam her şey çalışır.

Ama

Aşağıdaki küçük kod çalışmaz:

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

Peki verir: Aşağıdaki hata olsun

os.execvp("java", args)

? Neden kabuk içine yapıştırarak/yapıştırarak veya os.system() kullanıyor, ancak os.execvp() kullanıyor?

cevap

11

"Sınıf yolu" değişkeniniz örneğin "-classpath foo.jar" içeriyorsa, seçenek adı "-classpath foo.jar" olduğu için çalışmaz. İki argüman olarak bölün: [..., "-kalıpati", sınıf yolu, ...].

Diğer yollar (kopyalama ve yapıştırma ve sistem()), kabuk, komut satırını boşluklardan ayırdığı için çalışır (kaçmadıkça veya alıntı yapılmadıkça). Komut satırı gerçekte aranan programa bir dizi olarak (Windows'taki gibi) aktarılır ve JVM, yalnızca "-classpath" ile bir eleman bulmayı ve ardından classpath ile başka bir eleman bulmayı bekler.

yerine JVM aşağıdaki küçük Python komut dosyası arayarak kendiniz farkı görebilirsiniz:

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

str (list()) == repr (list()) –

+0

@John Millikin: Teşekkürler, gereksiz repr() öğesini kaldırdığımdan, "print sys.argv" komutunu kullanabilirsiniz. – CesarB

0

Eğer sınıf yolunda kabuk genişleme güvenerek olmadığından emin olun. Örneğin. "~/my.jar" bir os.system çağrısında kabuk tarafından genişletilecek, ancak bir os.execvp çağrısı olduğuna inanıyorum.