从Python调用Java

Dav*_*lla 115 python java

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

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

我听说过JPype:http ://jpype.sourceforge.net/ tutorial: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() 
Run Code Online (Sandbox Code Playgroud)

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

JPype是一个死的项目吗?

还有其他选择吗?

问候,大卫

Bar*_*emy 128

你也可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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

免责声明:我是Py4J的作者

  • @alvas我仍然保持Py4J,如果这就是你的意思. (7认同)

小智 45

以下是我对此问题的总结: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有点难以使用,因为你需要启动一个网关,增加另一层脆弱性.

  • 你的链接坏了.请更新积分. (6认同)

gdw*_*dw2 18

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
Run Code Online (Sandbox Code Playgroud)


k10*_*107 5

如果您使用的是 Python 3,则有一个名为JPype1-py3 的 JPype 分支

pip install JPype1-py3
Run Code Online (Sandbox Code Playgroud)

这在 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()
Run Code Online (Sandbox Code Playgroud)


小智 5

最近我一直在将很多东西集成到 Python 中,包括 Java。我发现的最可靠的方法是使用 IKVM 和 C# 包装器。

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

转换后的库就像本机 C# 库一样,您可以在不需要 JVM 的情况下使用它。然后,您可以创建一个 C# DLL 包装器项目,并添加对转换后的 DLL 的引用。

您现在可以创建一些包装存根来调用您想要公开的方法,并将这些方法标记为 DllEport。有关详细信息,请参阅/sf/answers/2089799701/

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

我已经用 Python 2.7 试过了,但它也应该适用于 3.0。适用于 Windows 和 Linuxes

如果您碰巧使用 C#,那么这可能是将几乎所有内容集成到 Python 时尝试的最佳方法。

  • 呃……你在 C# 中失去了我。我不会投反对票,因为这在某些情况下是可行的,但这绝对是假设 Windows 和许多其他东西。 (3认同)

Pet*_*ter 5

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

考虑到Jnius的安装问题(其他人也有),Javabridge已安装,但在我尝试使用时出现了神秘的错误,PyJ4不得不首先在Java中启动Gateway服务器,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
Run Code Online (Sandbox Code Playgroud)

你应该能够 import jpype

以下演示工作:

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

当我尝试调用自己的java代码时,我必须先编译(javac ./blah/HelloWorldJPype.java),然后我必须从默认路径更改JVM路径(否则你会得到无法理解的"找不到类"错误).对我来说,这意味着将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
...
Run Code Online (Sandbox Code Playgroud)