从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
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是一个已死的项目吗?
还有没有别的选择?
发布于 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[:]
)。
安装过程为:
git clone https://github.com/originell/jpype.git
cd jpype
python setup.py install
而且您应该能够import jpype
通
以下demo起作用了:
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命令更改为:
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
...
发布于 2015-04-05 13:27:26
如果您使用的是Python3,那么有一个名为JPype1-py3的JPype分支
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()
发布于 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中时,这可能是最好的尝试方法。
https://stackoverflow.com/questions/3652554
复制相似问题