首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Python调用Java

从Python调用Java
EN

Stack Overflow用户
提问于 2010-09-06 23:19:25
回答 6查看 200.1K关注 0票数 138

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

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

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

代码语言:javascript
复制
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是一个已死的项目吗?

还有没有别的选择?

EN

回答 6

Stack Overflow用户

发布于 2015-05-01 20:06:03

我使用的是osx10.10.2,并且成功地使用了JPype。

遇到了Jnius (others have too)的安装问题,PyJ4安装了Javabridge,但当我尝试使用它时,出现了神秘的错误,JCC有这样的不便之处,首先必须在Java中启动网关服务器,JCC不会安装。最后,JPype终于开始工作了。在Github上有个maintained fork of JPype它的主要优点是(a)安装正确,(b)可以非常有效地将java数组转换为数值数组(np_arr = java_arr[:])。

安装过程为:

代码语言:javascript
复制
git clone https://github.com/originell/jpype.git
cd jpype
python setup.py install

而且您应该能够import jpype

以下demo起作用了:

代码语言:javascript
复制
import jpype as jp
jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM() 

当我尝试调用我自己的java代码时,我必须首先编译(javac ./blah/HelloWorldJPype.java),并且我必须更改默认的JVM路径(否则您将得到难以解释的"class not found“错误)。对我来说,这意味着将startJVM命令更改为:

代码语言:javascript
复制
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
...
票数 6
EN

Stack Overflow用户

发布于 2015-04-05 13:27:26

如果您使用的是Python3,那么有一个名为JPype1-py3的JPype分支

代码语言:javascript
复制
pip install JPype1-py3

这对我在OSX / Python 3.4.3上是有效的。(您可能需要export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version)

代码语言:javascript
复制
from jpype import *
startJVM(getDefaultJVMPath(), "-ea")
java.lang.System.out.println("hello world")
shutdownJVM()
票数 5
EN

Stack Overflow用户

发布于 2015-04-25 04:06:59

我最近在Python中集成了很多东西,包括Java。我发现最健壮的方法是使用IKVM和C#包装器。

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

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

现在,您可以创建一些调用要公开的方法的包装器存根,并将这些方法标记为DllEport。详情请参见https://stackoverflow.com/a/29854281/1977538

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

我已经在Python2.7上试过了,但是它应该也能在3.0上工作。在Windows和Linuxes上运行

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3652554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档