我有一个 jar 形式的 java 库,可用于从文件(excel、xml 等)中提取数据。由于它在 java 中,它只能在 java 应用程序中使用。但我也需要将相同的库用于 python 项目。我已经尝试过从 jvm 获取对象的 py4j 等。但是该库不是可执行文件,不会“运行”。我已经检查了 Jython,但我需要可以从 Python 项目访问该库。我曾考虑过使用自动化的 java 到 python 的翻译器,但我会把它作为最后的手段。
请提出一些我可以做到这一点的方法。
您可以制作一个线程永不结束的一类 Java 程序,直到您从 Python 发送通知以执行此操作。
这样,lib 将保存在内存中,并可从您的 Python 程序访问。
这个类可能是这样的(添加你需要的库导入/初始化):
public class TestPy {
private Thread thread;
public void die() {
synchronized (thread) {
thread.interrupt();
}
}
public TestPy() {
thread = new Thread(){
public void run() {
try {
while (!Thread.interrupted()) {
Thread.sleep(500);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
};
thread.start();
}
public static void main(String[] args) {
TestPy tp = new TestPy();
GatewayServer server = new GatewayServer(tp);
server.start();
}
}
您必须启动 java 程序,使用 lib,然后使用 die() 方法在 Python 中杀死 java 程序:
gateway = JavaGateway()
do your stuff here using the lib
tp = gateway.entry_point
tp.die()
您可以编写一个简单的命令行 Java 程序,该程序调用该库并将结果保存为您可以在 Python 中读取的格式,然后您可以使用os.system
.
另一种选择是找到与Java库具有同等功能的Python库:您可以在Python中读取excel、xml和其他文件,这不是问题。
我还没有学习如何通过java构造函数在jar文件中创建java类的新实例,但是偶然发现使用任何java静态方法访问py2j中的java对象非常容易。
第 1 步:从https://pypi.python.org/pypi/py4j下载 py4j zip 文件。“py4j0.10.0.jar”在 zip 文件中。
第2步:安装py4j
pip install 'D:\Downloads\py4j-0.10.0.zip'
第 3 步:添加 py4j0.10.0.jar 和 the_lib_you_use.jar(如下例中的 owlapi-distribution-3.5.0.jar)以在 eclipse 项目中构建路径
第四步:创建AdditionApplication.java,将AdditionApplication.java的代码复制粘贴到https://www.py4j.org/,运行Java应用AdditionApplication.java
第 5 步:运行 AdditoinApplication.java 后,在 python 文件中测试示例代码:
if __name__ == '__main__':
pass
from py4j.java_gateway import JavaGateway
gateway = JavaGateway() # connect to the JVM
random = gateway.jvm.java.util.Random() # create a java.util.Random instance
number1 = random.nextInt(10) # call the Random.nextInt method
number2 = random.nextInt(10)
print(number1,number2)
(2, 7)
addition_app = gateway.entry_point # get the AdditionApplication instance
addition_app.addition(number1,number2) # call the addition method
Math = gateway.jvm.java.lang.Math
a = Math.max(4, 6);
print a
IRI = gateway.jvm.org.semanticweb.owlapi.model.IRI
abcIRI = IRI.create('fewf#fe')
print 'abcIRi = ' + str(abcIRI)
print 'abcIRI.getFragment() = ' + abcIRI.getFragment()
控制台上的结果是:
(5, 0)
6
abcIRi = fewf#fe
abcIRI.getFragment() = fe