通过Jython加载Python类

时间:2015-06-18 20:51:32

标签: java jython

我正在尝试通过在我的Java应用程序中嵌入Jython来加载Python类。

到目前为止我的代码是

        String pythonRoot = Main.class.getResource("/python").getPath();

        PySystemState state = new PySystemState();
        PyObject importer = state.getBuiltins().__getitem__(Py.newString("__import__"));

        PyObject sysModule = importer.__call__(Py.newString("sys"));

        final PyString pythonPath = Py.newString(pythonRoot);
        PyList path = (PyList) sysModule.__getattr__("path");
        path.add(pythonPath);

        PyModule module = (PyModule) importer.__call__(Py.newString("building.blah.again.blah2.Test"));
        PyObject klass = module.__getattr__(Py.newString("Address"));
        AddressInterface ai = (AddressInterface) klass.__call__().__tojava__(AddressInterface.class);

我正在尝试访问的课程可以在

中找到
/python/building/blah/again/blah2/Test.py

该类的名称是

Address

但是,这给了我例外

Exception in thread "main" ImportError: No module named blah2

如果我在上面的目录中放置一些文件,就像这样

/python/building/blah/again/Test.py

这给了我例外

Exception in thread "main" ImportError: No module named again

就好像他主动拒绝识别包含文件的目录一样。这可能是什么问题,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

如果您将模块的路径添加到通过path.add(pythonPath);执行的Python路径,则import-command仅需要模块的名称,而不是完整路径,即PyModule module = (PyModule) importer.__call__(Py.newString("Test")); 此外,您应该通过打印路径列表的内容来确认实际添加了正确的路径。另请注意,Test.py中的类声明必须扩展toJava的Address-java接口才能工作(我只是提到这一点,因为这也是常见的错误来源)。

那就是说,你使用Jython的方式对我来说有些麻烦。如果我是你,我会在python脚本中执行这些操作(添加路径,执行导入),通过org.python.util.PythonInterpreterhttp://www.jython.org/javadoc/org/python/util/PythonInterpreter.html)运行它并通过{{检索类PyObject 1}}或eval - 方法。