从python调用Java的最佳方法是什么?(对我来说,jython和RPC不是一个选择)。
我听说过JCC:http : //pypi.python.org/pypi/JCC/1.9 一个用于从C / Python调用Java的C 代码生成器,但这需要编译所有可能的调用。我希望有另一个解决方案。
我听说过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。
这是我对这个问题的总结:从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有点难以使用,因为您需要启动网关,从而增加了另一层脆弱性。
你也可以使用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具有自己的协议(用于优化某些情况,管理内存等)。