问题
从python调用java的最佳方法是什么? (jython和RPC不是我的选择)。
我听说过JCC:http://pypi.python.org/pypi/JCC/1.9a 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 热门回答(114 赞)
你也可以使用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 热门回答(31 赞)
以下是我对此问题的总结:5种从Python调用Java的方法
http://baojie.org/blog/2014/06/16/call-java-from-python/(缓存)
简短的回答:Jpype工作得很好并且在许多项目中得到证明(例如python-boilerpipe),但是Pyjnius比JPype更快更简单
我试过Pyjnius / Jnius,JCC,javabridge,Jpype和Py4j。
Py4j有点难以使用,因为你需要启动一个网关,增加另一层脆弱性。
#3 热门回答(13 赞)
Pyjnius。
文档:http://pyjnius.readthedocs.org/en/latest/
Github上:https://github.com/kivy/pyjnius
从github页面:
一个Python模块,使用JNI将Java类作为Python类访问。 PyJNIus是一个"正在进行中的工作"。快速概述>>>来自jnius import autoclass
autoclass('java.lang.System')。out.println('Hello world')Hello world
Stack = autoclass('java.util.Stack')
stack = Stack()
stack.push('你好')
stack.push('world')
print stack.pop()world
print stack.pop()你好