从Python调用Java

从python调用java的最佳方法是什么? (jython和RPC不是我的select)。

我听说过JCC: http : //pypi.python.org/pypi/JCC/1.9从C ++ / Python调用Java的C ++代码生成器但是这需要编译每一个可能的调用; 我宁愿另一种解决scheme。

我听说过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是一个死的项目吗?

还有其他的select吗?

问候,大卫

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

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

简单的回答:Jpype工作得很好,在许多项目(例如python-boilerpipe)中都被certificate,但是Pyjnius比JPype更快更简单

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

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

你也可以使用Py4J 。 在FrontPage和大量文档中都有一个例子,但是从本质上讲,您只需从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虚拟机上。

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

免责声明:我是Py4J的作者

Pyjnius。

文档: http : //pyjnius.readthedocs.org/en/latest/

Github: https : //github.com/kivy/pyjnius

从github页面:

使用JNI作为Python类访问Java类的Python模块。

PyJNIus是一项“正在进行的工作”。

快速浏览

 >>> from jnius import autoclass >>> autoclass('java.lang.System').out.println('Hello world') Hello world >>> Stack = autoclass('java.util.Stack') >>> stack = Stack() >>> stack.push('hello') >>> stack.push('world') >>> print stack.pop() world >>> print stack.pop() hello 

我刚刚开始使用JPype 0.5.4.2(2011年7月),它看起来像很好地工作…
我在Xubuntu 10.04上

最近我一直在将很多东西整合到Python中,包括Java。 我发现最强大的方法是使用IKVM和C#包装。

IKVM有一个小巧的应用程序,可以让你使用任何Java JAR,并直接将其转换为.Net DLL。 它只是将JVM字节码转换为CLR字节码。 有关详细信息,请参阅http://sourceforge.net/p/ikvm/wiki/Ikvmc/

转换后的库的行为与本地C#库相似,您可以在不需要JVM的情况下使用它。 然后,您可以创build一个C#DLL包装项目,并添加对转换后的DLL的引用。

您现在可以创build一些包装存根,调用您想要公开的方法,并将这些方法标记为DllEport。 有关详细信息,请参阅https://stackoverflow.com/a/29854281/1977538

包装器DLL就像本地C库一样,导出的方法看起来就像导出的C方法一样。 你可以像往常一样使用ctype连接到它们。

我已经用Python 2.7试了一下,但是也应该和3.0一起工作。 适用于Windows和Linux

如果你碰巧使用C#,那么当将任何东西集成到Python中时,这可能是最好的方法。

我在OSX 10.10.2上,并成功使用JPype。

使用Jnius( 其他人也有 )安装问题,安装了Javabridge,但是当我尝试使用它时发生了神秘的错误,PyJ4有这个不便之处,首先在Java中启动一个网关服务器,JCC不会安装。 最后,JPype结束了工作。 在Github上有一个JPype维护的分支 。 它具有以下主要优点:(a)安装正确;(b)能够非常高效地将java数组转换为numpy数组( np_arr = java_arr[:]

安装过程是:

 git clone https://github.com/originell/jpype.git cd jpype python setup.py install 

你应该可以import jpype

以下演示工作:

 import jpype as jp jp.startJVM(jp.getDefaultJVMPath(), "-ea") jp.java.lang.System.out.println("hello world") jp.shutdownJVM() 

当我尝试调用我自己的java代码时,我必须先编译( javac ./blah/HelloWorldJPype.java ),并且必须从默认path中更改JVMpath(否则会得到无法解释的“class not found”错误) 。 对我而言,这意味着将startJVM命令更改为:

 jp.startJVM('/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/MacOS/libjli.dylib', "-ea") c = jp.JClass('blah.HelloWorldJPype') # Where my java class file is in ./blah/HelloWorldJPype.class ... 

我假设,如果你可以从C ++到Java,那么你是所有的设置。 我已经看到你提到的那种产品很好用。 碰巧,我们使用的是CodeMesh 。 我并不特别赞同这个供应商,也没有对他们的产品的相对质量做任何声明,但是我已经看到它在相当大量的情况下工作。

我会一般地说,如果可能的话,我会build议通过JNI避免直接集成。 一些简单的REST服务方法或者基于队列的体系结构往往会更容易开发和诊断。 如果您仔细使用这种解耦技术,您可以获得相当不错的性能。

通过我自己的经验试图从python ia方式运行一些java代码的方式类似于Python代码在Python代码中运行,我无法find一个简单的方法。

我对我的问题的解决scheme是通过运行此java代码作为beanshell脚本通过调用beanshell解释器作为一个shell从我的python代码中编译后的java代码在一个临时文件与适当的包和variables。

如果我在说什么有什么帮助,我很乐意帮助你分享我的解决scheme的更多细节。

如果你使用的是Python 3,那么JPype就有一个名为JPype1-py3的分支

 pip install JPype1-py3 

这在OSX / Python 3.4.3上适用于我。 (您可能需要export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version

 from jpype import * startJVM(getDefaultJVMPath(), "-ea") java.lang.System.out.println("hello world") shutdownJVM()