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 arg1 arg2”在命令行上运行它们)。

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 回答