4

私はJava内からJythonを使用しています。だから私は以下のようなJavaのセットアップを持っています:

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 arg1arg2」を使用して実行できるようにしたい)。

4

2 に答える 2

9

私はJython 2.5.2を使用runScriptしていますが、存在しなかったため、execfile. その違いとは別に、argvオブジェクトを作成する前に状態オブジェクトを設定する必要もありましたPythonInterpreter

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 で、その中に空の文字列があるため、上記のコードの結果は次のようになります。

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

実際のスクリプト名にする必要がある場合はargv[0]、次のように状態を作成する必要があります。

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"));

出力は次のとおりです。

hello
['myscript.py', 'arg1', 'arg2']
于 2011-06-28T16:51:06.470 に答える
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);
于 2015-09-09T07:28:09.223 に答える