7

os.execvpPython での使用について質問があります。引数のリストを作成するために使用される次のコードがあります。

引数 = [「Java」
       、クラスパス
       , "-Djava.library.path=" + lib_path()
       、各
       、「-Xmx1000m」
       、「-サーバー」
       、「code_swarm」
       、パラメータ
       ]

を使用して文字列を出力し、" ".join(args)それをシェル プロンプトに貼り付けると、JVM が正常に起動し、すべてが機能します。os.system(" ".join(args))Python スクリプトでも使用すると、すべてが機能します。

ただし、次のコードは機能しません。

os.execvp("Java", args)

次のエラーが表示されます。

認識されないオプション: -classpath [そして、私が作成したクラスパス、問題ないようです]
Java仮想マシンを作成できませんでした。

それで、何が得られますか?シェルへのコピー/貼り付けまたは使用が機能するのに、なぜ機能しos.system()ないのos.execvp()ですか?

4

2 に答える 2

11

「classpath」変数にたとえば「-classpath foo.jar」が含まれている場合、オプション名が「-classpath foo.jar」であると見なされるため、機能しません。[..., "-classpath", classpath, ...] の 2 つの引数に分割します。

他の方法 (コピー アンド ペーストおよび system()) は、シェルがコマンド ラインをスペースで分割するため機能します (スペースがエスケープまたは引用されていない場合)。実際、コマンドラインは (Windows とは異なり) 配列として呼び出されたプログラムに渡されます。JVM は、"-classpath" のみを持つ要素の後にクラスパスを持つ別の要素が続くことを期待しています。

JVM の代わりに次の小さな Python スクリプトを呼び出すことで、違いを自分で確認できます。

#!/usr/bin/python
import sys
print sys.argv
于 2008-10-17T03:07:53.280 に答える
0

クラスパスでシェル展開に依存していないことを確認してください。たとえば、「~/my.jar」は os.system 呼び出しでシェルによって展開されますが、そうではありません。私は os.execvp 呼び出しを信じています。

于 2008-10-17T12:11:04.557 に答える