通过脚本引擎(jython)从Java调用Python?

10

我试图在一个使用javax.script的Java 6应用程序中调用Jython:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class jythonEx
{
    public static void main (String args[]) throws ScriptException
    {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine pyEngine = mgr.getEngineByName("python");
        try {
            pyEngine.eval("print \"Python - Hello, world!\"");
        } catch (Exception ex) {
            ex.printStackTrace();
        }       
    }
}

这会导致空指针异常:

java.lang.NullPointerException
        at jythonEx.main(jythonEx.java:12)

有人知道我在这里做错了什么吗?

编辑:

感谢回复!我将jython.jar添加到类路径中,现在可以正常运行:

java -cp "./;jython.jar" jythonEx

第12行是哪一行?pyEngine.eval("");? - ilikeorangutans
@ilikeorangutans:是的,那就是第12行。 - OscarRyz
没错。我假设ScriptEngineManager找不到Python引擎,但我不知道我做错了什么会导致这种情况... - griffin
2个回答

15
您需要首先注册您的引擎。根据ScriptEngineManager.getEngineByName,它会首先搜索已注册为句柄的ScriptEngineFactory。如果没有找到这样的工厂,则返回null。
用户指南中提到,要使用JSR-223,您需要:
随着Jython 2.5.1的发布,JSR 223的实现已经捆绑在jython.jar中。只需将jython添加到CLASSPATH并请求python脚本引擎即可。 您已经这样做了吗? 编辑 关于您的评论:我认为您应该开一个新问题,这样您会得到更好的答案。

不,我从来没有这样做过,谢谢!我以前使用过javax.script的JavaScript而没有做任何事情,所以我显然错过了那一步。让我现在试试看... - griffin
@griffin 太好了!可能那样就可以了。如果有效,请告诉我们,好吗? - OscarRyz
@griffin 我很高兴!祝你在Python和Java集成方面好运;) - OscarRyz

2

你可能需要为'python'注册一个ScriptEngineFactory。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接