【问题标题】:Jpype import cannot find module in jarJpype导入在jar中找不到模块
【发布时间】:2020-11-07 03:26:58
【问题描述】:

我在工作中收到了一项任务,即找到一种方法来使用 Python 项目中现有 jar 文件中的某些方法。我在 Python 方面的经验非常有限,但我之前使用过那个特定的 jar 文件(它是我们正在处理的项目的一部分)。我不允许修改这两个项目的大部分内容,并且要求它们尽可能独立。

我研究了多种在 Python 中包含 jar 方法的方法。到目前为止,我已经尝试过 Jython(我不能使用它,因为 Python 项目在其他库中使用 PyQt,如果我的理解是正确的,这会强制使用 CPython)、Pyjnius 和 JPype。 JPype 似乎是最有前途的,但我也无法让它工作。我在下面粘贴了我的代码,由于我不知道我可以分享多少,所以略有删节。

from jpype import *
import jpype.imports

try:
    jpype.addClassPath("jars/sdk.jar") #the relative path to the jar file
    jpype.startJVM(convertStrings=False)
    java.lang.System.out.println(jpype.getClassPath()) #printing the classpath to check, the path is correctly pointing to the sdk.jar file

    java.lang.System.out.println("Hello world") #just to check if jpype is installed correctly, works

    jpype.imports.registerDomain("a")
    from a.b.c.d.e.f.g.h import SomeClass #fails here

except OSError as err:
    print(err)  # ToDo: Remove print when done
    pass

我得到的错误是找不到模块 a.b.c.d.e.f.g.h.SomeClass。我尝试了不同的方式来给出路径(绝对路径、相对路径、将 jar 放在项目中和项目外部的不同位置),但这似乎不是问题,因为打印的路径是正确的绝对路径jar 文件的路径。

此外,该 jar 用于其他 (Java) 项目并且可以正常工作。它是使用 maven 包创建的(使用 IntelliJ,如果它是相关的,并且与 JPype JVM 使用的 Java 版本相同)。在 Java 项目中,导入将是:

import a.b.c.d.e.f.g.h.SomeClass;

我已经复制了这个,只是将语法转换为 Python。

我还尝试使用 JObject 创建类(我可能没有做对)并且还尝试了使用 JPackage 的旧语法(据我所知)。对于 JPackage 方式,我得到包 a.b.c.d.e.f.g.h.SomeClass.someMethod 不可调用的异常,据我了解,这与我使用 jpype 导入的包是等效的异常。我已经解决了所有可以在这里找到的类似问题的问题,但这些解决方案都没有帮助我。

谁能提出一些可能的解决方案?或者任何人都可以看到我做错了什么?也欢迎提出替代 JPype 的其他可能性的建议。如果需要任何澄清,我将编辑问题。

【问题讨论】:

  • 您是否尝试过使用jpype.JPackage 进行导入?
  • 是的,还是不行。我想我上面提到过,它给出了当我尝试访问方法时包不可调用的错误。
  • 对不起,我一开始没看;只是出于好奇,您是否尝试过使用 jar 的绝对路径。?
  • 是的,这是我最初的想法之一。但是还是不行,然后我开始打印classpath,路径是正确的(即使我给它作为相对路径)。
  • 我已经使用 Jpype 1.0.1 重新创建了相同的步骤,它对我有用,但是唯一不起作用的情况是我给出了错误的路径,jpype 和 python 的版本你在用吗?

标签: java python import executable-jar jpype


【解决方案1】:

如果 jar 在类路径中并且无法导入,唯一可能的情况是缺少一些依赖项。您还有另外两种方法可以尝试加载可能提供额外诊断的类。

jpype.JClass("a.b.c.d.e.f.g.h.SomeClass")

jpype.JClass("java.lang.Class").forName("a.b.c.d.e.f.g.h.SomeClass")

第一个是通过完整的类规范手动加载一个类。机械地,这是在导入下发生的事情。第二个是调用 Java 加载类(绕过所有 JPype)。它返回一个 java.lang.Class,可以将其传递给 JClass 以进行包装。

常见的故障包括缺少 jar 或本机库、尝试从模块内启动 JPype 并具有错误的相对路径、由于缺少资源而导致类初始化错误。 JPype 只是调用 JNI 调用,所以如果 Java 端一切正常,它应该可以工作。鉴于您检查了 java.class.path 系统变量,它必须与类资源有关。

如果您想尝试寻找其他软件包,JPype 用户手册有一个替代部分。除了 PyJnius 之外,大多数替代品似乎都没有维护。

【讨论】:

  • jar 文件确实存在一些问题,在修复它们并再次尝试一切之后,您的第二个建议奏效了。 JPype 和 Python 项目使用的其他一些库之间似乎存在某种冲突,但到目前为止它似乎工作得很好。谢谢你的回答!
猜你喜欢
  • 2018-06-24
  • 2016-07-02
  • 2021-11-13
  • 2017-10-17
  • 2021-10-20
  • 1970-01-01
  • 2019-09-07
  • 2016-07-05
  • 2013-02-13
相关资源
最近更新 更多