Java Python集成

我有一个Java应用程序需要与第三方库集成。 图书馆是用Python编写的,我对此没有任何发言权。 我试图找出最好的方法来整合它。 我正在尝试JEPP(Javaembedded式Python) – 有谁曾经使用过? 我的另一个想法是使用JNI与Python的C绑定进行通信。

任何想法,最好的办法做到这一点,将不胜感激。 谢谢。

为什么不使用Jython ? 我可以立即想到的唯一缺点是如果您的库使用CPython本机扩展。

编辑:如果你现在可以使用Jython,但认为你可能有问题的更高版本的库,我build议你尝试从你的应用程序(例如某种适配器接口)的库隔离。 用目前最简单的方法去做,然后在需要的时候考虑JNI / CPython / etc。 除非你真的需要,否则去(痛苦的)JNI路线是没有什么好处的。

坦率地说, 绝大多数直接从JVM内部运行Python的方法都不起作用 。 它们或者不是很兼容(你的第三方库的新版本可以使用python2.6的特性,不能用于Jython2.5)或者hacky(它将会破坏神秘的JVM堆栈跟踪而不是真正的解决scheme)。

我最好的方式来整合两者将使用RPC 。 如果您的数据量适中,则XML RPC不是一个错误的select。 它得到了很好的支持 – Python在它的标准库中。 Java库也很容易find。 现在取决于你的设置,Java或Python部分将是一个服务器接受来自其他语言的连接。

一个不太受欢迎但值得考虑的替代方法来做RPC是Google protobuffers,有2/3的支持很好的rpc 。 你只需要提供你的传输层。 没有那么多的工作和写作的便利是合理的。

另一个select是围绕您需要公开给Java的Pythonfunction编写一个C封装器,并通过JVM本机插件使用它。 你可以用SWIG SWIG缓解痛苦。

基本上你的情况是这样的:

  1. 为从Java到C ++的所有方法调用创build一个SWIG接口。
  2. 创buildC / C ++代码,将接收您的调用,并在内部调用python解释器与右参数。
  3. 转换你从python得到的回应,并通过swig发送回你的Java代码。

这个解决scheme相当复杂,在大多数情况下有点矫枉过正。 如果你(出于某种原因)不能支付RPC,那么这样做还是值得的。 虽然RPC仍然是我的首选。

我的另一个想法是使用JNI与Python的C绑定进行通信。

我非常喜欢JNA :

JNA为Java程序提供了轻松访问本地共享库(Windows上的DLL)的function,而无需编写任何Java代码,无需JNI或本地代码。 这个function相当于Windows的平台/调用和Python的ctypes。 访问在运行时是dynamic的,无需生成代码。

我的0.02 $ 🙂

您是否考虑过在Java VM上运行Jython ?

我已经调查了与JNI类似的设置。 也许这将有助于如果还没有看到它:

http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python

http://jpe.sourceforge.net/

如果你能让你的Python代码在Jython中工作,那么你应该可以使用它来从Java调用它:

你可以使用像ActiveMQ这样的消息服务。 它同时支持Python和Java。 这样,您可以将复杂的JNI或C绑定保留原样,只处理我认为简单的接口。 而且,当图书馆得到更新时,如果有的话,你不需要改变太多。

多年以后,只要添加一个这些日子更stream行的选项…

如果你需要CPython的function, py4j是一个不错的select。 py4j在2016年看到了频繁的更新,并且已经获得了一些普及,因为它被例如Apache Spark用来实现CPython的互操作性 。