将Java类导入python项目

时间:2016-02-28 04:58:34

标签: java python cross-platform multilingual cross-language

我一直在尝试找到一种将Java-ml导入我的python项目的方法。我的jar文件与我的项目在同一路径中。

我想将它用于kmeans群集,因为它允许我更改距离度量。我想知道是否有你建议的实现,我是否能够传递一个不同的java类作为函数的参数?

我尝试使用:

import sys

sys.path.append(r"C:\Users\X\Desktop\X\javaml-0.1.7\javaml-0.1.7.jar")

import net.sf.javaml as jml

test = jml.clustering.Kmeans()

我考虑使用jython,但我不确定它是如何工作的,目前还不清楚我是否可以继续使用空闲以及是否需要重新编程我的项目。

最后我考虑使用PyJNIus,但它根本不起作用。

2 个答案:

答案 0 :(得分:1)

简而言之,您无法在CPython解释器中本机运行Java代码。

首先,Python只是该语言规范的名称。如果您使用的是操作系统提供的Python(或从官方Python网站下载),那么您正在使用CPython。 CPython无法解释Java代码。

但是,正如您所提到的,JVM中有一个名为Jython的Python实现。 Jython是Python的一个实现,它在JVM上运行,因此可以与Java模块交互。但是,很少有人使用Jython,因此您将自己有一些关于使一切正常工作的方法。您不需要重新编写您的vanilla Python代码(因为Jython可以解释Python 2.x),但不支持所有库(例如numpy)。

最后,我认为您需要更好地理解K-Means算法,因为算法是根据欧几里德距离隐式定义的。使用任何其他距离度量将不再被视为K-Means并且可能影响算法的收敛。有关详细信息,请参阅here

同样,您无法在CPython解释器中本机运行Java代码。当然,有各种第三方库可以处理Java和Python之间的数据编组。但是,我支持我的声明对于这个特定的用例你可能更好地使用本机Python库(类似于Scikit-Learn中的K-Medoid)。在我看来,试图通过Java来调用所有相关的开销对于这个问题来说是过度的。

答案 1 :(得分:1)

回答"回答"如果您只想导入Java类,Jython将是您最好的选择。 Jython努力尽可能地与Python 2.x兼容并且做得很好。所以你不必花太多时间重写代码。只需使用Jython运行它,看看会发生什么,然后修改中断的内容。

现在回答Python:D。您可能希望将scikit用于本机实现。它肯定比在Jython中运行任何东西都快。

更新

我认为Py4J模块是您正在寻找的模块。它的工作原理是在Java代码中运行服务器,Python代码将与Java服务器通信。唯一的好处是" Py4J"是它为您提供锅炉板代码。您可以非常轻松地设置自己的客户端/服务器而无需额外的模块。但是,与Pythons本机模块相比,我仍然认为它不是一个更好的选择。

参考

How to import Java class w/ Jython

Scikit - K-Means