Jython 2.5.1:从 Java 调用到 __main__ - 如何传入命令行参数?

Posted

技术标签:

【中文标题】Jython 2.5.1:从 Java 调用到 __main__ - 如何传入命令行参数?【英文标题】:Jython 2.5.1: Calling From Java into __main__ - how to pass in command line args? 【发布时间】:2011-09-21 23:36:24 【问题描述】:

我在 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' 运行它们)。

【问题讨论】:

【参考方案1】:

我使用的是 Jython 2.5.2 和 runScript 不存在,所以我不得不用 execfile 替换它。除了这个区别之外,我还需要在创建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,其中包含一个空字符串,因此前面的代码导致输出:

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']

【讨论】:

不错的一个 - 我只需要在我发布的 Jython 中检查一下(实际上是 2.5.1..不是 2.5 - 道歉);我会尽快标记为已接受。干杯 另外:'runScript' 是我的方法 - 我已将类包装在我的代码中 - 我已更正原始帖子以使用 'execfile' 是的,很好吃;注意到似乎有一个记录在案的方法来检索 systemState,但我的发行版上似乎没有:jython.org/javadoc/org/python/util/… - 感谢接受的答案。【参考方案2】:

对于上述解决方案不起作用的人,请尝试以下方法。这适用于我的 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);

【讨论】:

以上是关于Jython 2.5.1:从 Java 调用到 __main__ - 如何传入命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

java 调用 python脚本 ImportError: No module named os

在 Java 中调用 Python?

java调用python问题

Java调用Python程序方法Jpython使用

Java调用Python程序方法Jpython使用

Java调用Python程序方法Jpython使用