Jpype 导入在 jar 中找不到模块
Jpype import cannot find module in jar
我在工作中接到任务,要找到一种方法来使用 Python 项目中现有 jar 文件中的某些方法。我在 Python 方面的经验非常有限,但我之前使用过那个特定的 jar 文件(它是我们正在进行的项目的一部分)。我不允许对这两个项目进行太多修改,并且要求它们尽可能独立。
我研究了多种将 jar 方法包含在 Python 中的方法。到目前为止,我已经尝试过 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,如果它是相关的,并且 Java 版本与 JPype JVM 使用的版本相同)。在 Java 个项目中,导入将是:
import a.b.c.d.e.f.g.h.SomeClass;
我已经复制了这个,只是将语法转换为 Python。
我还尝试使用 JObject 创建 class(我可能没有做对),还尝试使用 JPackage 的旧语法(据我所知)。对于 JPackage 方式,我得到包 a.b.c.d.e.f.g.h.SomeClass.someMethod 不可调用的异常,据我所知,这与我使用 jpype 导入得到的异常是等效的。我已经解决了所有我能在这里找到的类似问题的问题,但是 none 这些解决方案对我有所帮助。
任何人都可以提出一些可能的解决方案吗?或者任何人都可以看到我做错了什么?也欢迎提出替代 JPype 的其他可能性的建议。如果需要任何说明,我将编辑问题。
如果 jar 在 class 路径上并且导入失败,唯一可能的情况是缺少一些依赖项。您还有其他两种方法可以尝试加载 class,这可能会提供额外的诊断。
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")
第一个是通过完整 class 规范手动加载 class。它是机械地在进口下发生的事情。第二个是调用 Java 加载 class(绕过所有 JPype)。它 returns 一个 java.lang.Class 可以传递给 JClass 来制作包装器。
常见故障包括缺少 jar 或本机库、尝试从模块内启动 JPype 并且具有错误的相对路径、由于缺少资源导致 class 初始化错误。 JPype 只是调用 JNI 调用,所以如果 Java 结束时一切正常,它应该可以工作。鉴于您检查了 java.class.path 系统变量,它必须与 class 资源有关。
如果您想尝试寻找其他包,JPype 用户手册有一个备选部分。除了 PyJnius 之外的大多数替代品似乎都没有维护。
我在工作中接到任务,要找到一种方法来使用 Python 项目中现有 jar 文件中的某些方法。我在 Python 方面的经验非常有限,但我之前使用过那个特定的 jar 文件(它是我们正在进行的项目的一部分)。我不允许对这两个项目进行太多修改,并且要求它们尽可能独立。
我研究了多种将 jar 方法包含在 Python 中的方法。到目前为止,我已经尝试过 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,如果它是相关的,并且 Java 版本与 JPype JVM 使用的版本相同)。在 Java 个项目中,导入将是:
import a.b.c.d.e.f.g.h.SomeClass;
我已经复制了这个,只是将语法转换为 Python。
我还尝试使用 JObject 创建 class(我可能没有做对),还尝试使用 JPackage 的旧语法(据我所知)。对于 JPackage 方式,我得到包 a.b.c.d.e.f.g.h.SomeClass.someMethod 不可调用的异常,据我所知,这与我使用 jpype 导入得到的异常是等效的。我已经解决了所有我能在这里找到的类似问题的问题,但是 none 这些解决方案对我有所帮助。
任何人都可以提出一些可能的解决方案吗?或者任何人都可以看到我做错了什么?也欢迎提出替代 JPype 的其他可能性的建议。如果需要任何说明,我将编辑问题。
如果 jar 在 class 路径上并且导入失败,唯一可能的情况是缺少一些依赖项。您还有其他两种方法可以尝试加载 class,这可能会提供额外的诊断。
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")
第一个是通过完整 class 规范手动加载 class。它是机械地在进口下发生的事情。第二个是调用 Java 加载 class(绕过所有 JPype)。它 returns 一个 java.lang.Class 可以传递给 JClass 来制作包装器。
常见故障包括缺少 jar 或本机库、尝试从模块内启动 JPype 并且具有错误的相对路径、由于缺少资源导致 class 初始化错误。 JPype 只是调用 JNI 调用,所以如果 Java 结束时一切正常,它应该可以工作。鉴于您检查了 java.class.path 系统变量,它必须与 class 资源有关。
如果您想尝试寻找其他包,JPype 用户手册有一个备选部分。除了 PyJnius 之外的大多数替代品似乎都没有维护。