2011-06-24 16 views
4

私はJava内からJythonを使用しています。私は以下に類似したJavaのセットアップがあります。Jython 2.5.1:Javaから__main__への呼び出し - コマンドライン引数を渡すには?

String scriptname="com/blah/myscript.py" 
PythonInterpreter interpreter = new PythonInterpreter(null, new PySystemState()); 
InputStream is = this.getClass().getClassLoader().getResourceAsStream(scriptname); 
interpreter.execfile(is); 

をそして、これは(例えば)以下のスクリプトを実行します:

# myscript.py: 
import sys 

if __name__=="__main__": 
    print "hello" 
    print sys.argv 

私はこの方法を使用して「コマンドライン」引数を渡す方法は? (私はJythonスクリプトを書くことができるので、コマンドラインで 'python script arg1 arg2'を実行することもできます)。

答えて

9

私はJython 2.5.2を使用しており、runScriptは存在しませんでしたので、execfileに置き換える必要がありました。別にその差から、IもPythonInterpreterオブジェクトを作成する前の状態オブジェクト内argvを設定するために必要な:状態オブジェクト内

String scriptname = "myscript.py"; 

PySystemState state = new PySystemState(); 
state.argv.append (new PyString ("arg1")); 
state.argv.append (new PyString ("arg2")); 

PythonInterpreter interpreter = new PythonInterpreter(null, state); 
InputStream is = Tester.class.getClassLoader().getResourceAsStream(scriptname); 
interpreter.execfile (is); 

argvリストは、最初ので、その中に空の文字列で、1の長さを有しています出力に上記のコードの結果は:

PySystemState state = new PySystemState(); 
state.argv.clear(); 
state.argv.append (new PyString (scriptname));  
state.argv.append (new PyString ("arg1")); 
state.argv.append (new PyString ("arg2")); 
:あなたは、実際のスクリプト名であることを argv[0]が必要な場合は

hello 
['', 'arg1', 'arg2'] 

、あなたはこのような状態を作成する必要があるだろう10

その後、出力は次のようになります。上記のソリューションが動作しない人々のため

hello 
['myscript.py', 'arg1', 'arg2'] 
+0

素敵な1 - 私はちょうどよのJythonの私のリリース(実際には2.5.1でこれをチェックアウトする必要があります。.. 2.5ではない - 謝罪)。私はすぐに受け入れられるとマークします。 Cheers – monojohnny

+0

また、 'runScript'は私のメソッドでした - 私は自分のコードでクラスをラップしました - 私は 'execfile'を使うために元の投稿を修正しました – monojohnny

+0

systemStateを取得するための文書化されたメソッドがあるように見えるが、私のディストリビューションには存在しないようだ。http://www.jython.org/javadoc/org/python/util/PythonInterpreter.html#getSystemState%28 %29 - ありがとうございました。 – monojohnny

0

、以下を試してみてください。これはjythonバージョン2.7.0で私のために働きます

String[] params = {"get_AD_accounts.py","-server", "http://xxxxx:8080","-verbose", "-logLevel", "CRITICAL"}; 

上記のコマンドは以下のとおりです。すなわち、各引数およびその値は、params配列内の別個の要素である。

Jythonのget_AD_accounts.py -logLevel CRITICAL -server http://xxxxxx:8080 -verbose

PythonInterpreter.initialize(System.getProperties(), System.getProperties(), params); 

PySystemState state = new PySystemState() ; 

InputStream is = new FileInputStream("C:\\projectfolder\\get_AD_accounts.py"); 
      PythonInterpreter interp = new PythonInterpreter(null, state); 

PythonInterpreter interp = new PythonInterpreter(null, state); 
interp.execfile(is); 
関連する問題