質問
Pythonでの os.execvp
の使用について質問があります。引数のリストを作成するために使用される以下のコードがあります:
args = [ "java" , classpath , "-Djava.library.path=" + lib_path() , ea , "-Xmx1000m" , "-server" , "code_swarm" , params ]
"を使用して文字列を出力するとき" .join(args)
をシェルプロンプトに貼り付けると、JVMが正常に起動し、すべてが機能します。 Pythonスクリプトで os.system("" .join(args))
を使用してもすべてが機能します。
次のコードは機能しません:
os.execvp("java", args)
次のエラーが表示されます:
Unrecognized option: -classpath [and then the classpath I created, which looks okay] Could not create the Java virtual machine.
では、何が得られますか?シェルへのコピー/貼り付けまたは os.system()
の使用は機能するが、 os.execvp()
は機能しないのはなぜですか?
解決
「クラスパス」が変数には、たとえば「-classpath foo.jar」が含まれていますが、オプション名が「-classpath foo.jar」であると考えられているため、機能しません。 2つの引数に分割します:[...、" -classpath&quot ;, classpath、...]。
他の方法(コピーアンドペーストおよびsystem())は、シェルがコマンドラインをスペースで分割するため(エスケープまたは引用符で囲まれていない場合)動作します。コマンドラインは実際には(Windowsとは異なり)呼び出されたプログラムに配列として渡され、JVMは" -classpath"のみを持つ要素を見つけることを期待しています。クラスパスを持つ別の要素が続きます。
JVMの代わりに次の小さなPythonスクリプトを呼び出すことで、違いを確認できます。
#!/usr/bin/python
import sys
print sys.argv
他のヒント
クラスパスでシェル拡張に依存していないことを確認してください。例えば。 "〜/ my.jar" os.system呼び出しでシェルによって展開されますが、os.execvp呼び出しではないと考えられます。