【问题标题】:Load Python class through Jython通过 Jython 加载 Python 类
【发布时间】:2015-09-04 16:42:33
【问题描述】:

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

我目前的代码是

String pythonRoot = Main.class.getResource("/python").getPath(); PySystemState 状态 = 新 PySystemState(); PyObject importer = state.getBuiltins().__getitem__(Py.newString("__import__")); PyObject sysModule = importer.__call__(Py.newString("sys")); 最终 PyString pythonPath = Py.newString(pythonRoot); PyList path = (PyList) sysModule.__getattr__("path"); path.add(pythonPath); PyModule 模块 = (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

而班级的名字是

地址

但是,这给了我一个例外

线程“主”ImportError 中的异常:没有名为 blah2 的模块

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

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

这给了我一个例外

线程“主”ImportError 中的异常:没有再次命名模块

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

【问题讨论】:

    标签: java jython


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2011-02-09
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多