从 Python 调用 Java

2022-08-31 07:47:57

从python调用java的最佳方法是什么?(jython和RPC对我来说不是一个选择)。

我听说过JCC:http://pypi.python.org/pypi/JCC/1.9 一个C++代码生成器,用于从C++ / Python调用Java,但这需要编译每个可能的调用;我更喜欢另一种解决方案。

我听说过JPype:http://jpype.sourceforge.net/ 教程:http://www.slideshare.net/onyame/mixing-python-and-java

import jpype 
jpype.startJVM(path to jvm.dll, "-ea") 
javaPackage = jpype.JPackage("JavaPackageName") 
javaClass = javaPackage.JavaClassName 
javaObject = javaClass() 
javaObject.JavaMethodName() 
jpype.shutdownJVM() 

这看起来像我需要的。但是,最后一个版本是从2009年1月开始的,我看到人们无法编译JPype。

JPype是一个死项目吗?

还有其他选择吗?


答案 1

你也可以使用Py4J。首页上有一个示例和大量文档,但从本质上讲,您只需从python代码中调用Java方法,就好像它们是python方法一样:

from py4j.java_gateway import JavaGateway
gateway = JavaGateway()                        # connect to the JVM
java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
other_object = java_object.doThat()
other_object.doThis(1,'abc')
gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method

与Jython相反,Py4J的一部分在Python VM中运行,因此它始终与最新版本的Python“最新”,您可以使用在Jython上运行不佳的库(例如,lxml)。另一部分在要调用的 Java VM 中运行。

通信是通过套接字而不是JNI完成的,Py4J有自己的协议(优化某些情况,管理内存等)。

免责声明:我是Py4J的作者


答案 2

以下是我对这个问题的总结:从Python调用Java的5种方法

http://baojie.org/blog/2014/06/16/call-java-from-python/缓存))

简短的回答:Jpype运行得很好,并且在许多项目(如python-boilerpipe)中得到了验证,但是Pyjnius比JPype更快,更简单

我尝试过Pyjnius / Jnius,JCC,javabridge,Jpype和Py4j。

Py4j有点难以使用,因为您需要启动网关,从而增加另一层脆弱性。