2015-06-18 68 views
0

我想通过在我的Java应用程序中嵌入Jython来加载Python类。通过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 

就好像他正在积极拒绝承认目录包含的文件。这里可能是什么问题,我该如何着手解决这个问题?

回答

0

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

也就是说,你使用Jython的方式对我来说显得有些麻烦。如果我是你,我会在python脚本中做这些事情(添加路径,进行导入),通过org.python.util.PythonInterpreterhttp://www.jython.org/javadoc/org/python/util/PythonInterpreter.html)运行它并通过evalget-方法检索类PyObject。