【发布时间】: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