从java调用jython方法:无法在导入中定位模块

时间:2014-03-28 09:15:08

标签: java integration jython

问题陈述:我正在使用PySystemState在java类中调用我的jython模块并在其上执行一些方法。现在问题是我的jython模块对位于同一个jython项目中的并行目录中的其他一些jython模块有一些依赖关系。因此,当我调用目标模块时,它会抛出导入异常,说明无法找到依赖模块。

我的jython项目的结构:

jythonproject
  -src
     -folder1<has the module which is invoked from java>
     -folder2 < it has the modules which the module inside folder1 imports with statemet "from folder2 import x"

例外=&gt;没有名为folder2的模块

请注意,在java项目中,我正在设置JYTHONPATH env变量,其中包含folder1和folder2的路径。

我正在使用ey环境和jython 5.3。

2) 更多的研究:我正在使用PySystemState从java调用jython模块。这是加载模块和类的规范。

 // Constructor obtains a reference to the importer, module, and the class name
 public JythonObjectFactory(PySystemState state, Class interfaceType, String moduleName, String className) {
     this.interfaceType = interfaceType;
     PyObject importer = state.getBuiltins().__getitem__(Py.newString("__import__"));
     PyObject module = importer.__call__(Py.newString(moduleName));
     klass = module.__getattr__(className);
     System.err.println("module=" + module + ",class=" + klass);
 }

似乎我只导入folder1中的模块,然后在其中获取类来调用方法。现在,由于此模块从其他模块导入,这些模块位于folder2中,并且它们未在java代码中加载,因此无法找到模块。 现在的问题是我应该如何在folder2中加载依赖模块以及我需要的folder1中的模块。

伙计我注意到文件夹2中的模块导入模块中的另一件事我从java调用它没有类。所以我从java调用的模块有一个我正在调用的类,该类依赖于一个jython模块,它有一些方法,但它不是一个类。这就是为什么它不起作用而且我得到例外的原因。

尝试了其他一些事情,结果如下: 场景1:        pkg1的module1为class1        pkg2的module2和class2 并且模块1具有import =&gt;来自module2 import class2 现在,当我从java程序调用class1时,这很好。

Scenario2:        pkg1的module1为class1        pkg2有module2,它有方法定义而没有类 并且模块1具有import =&gt;来自pkg2 import module2 现在,当我从java程序调用class1时,这会抛出异常。

结论: 1)从java调用jython类时,我们不能使用从包中导入。 2)我们不能从java调用jython类,它从没有类的模块导入(只是方法定义)。因为jython在这种情况下只允许“从pkg导入”,所以我们再次遇到问题,如第1点所述。

1 个答案:

答案 0 :(得分:0)

您可能需要设置JYTHONPATH。请在此处查看相关的Stackoverflow问题。 Jython does not load PYTHONPATH into sys.path