Java的Python集成Java的Python集成(Java Python Integration

2019-06-12 06:54发布

我有一个需要与第三方库集成Java应用程序。 该库是用Python写的,我没有在任何发言权。 我试图找出与它集成的最佳途径。 我尝试JEPP(Java的嵌入式Python) - 有没有人使用的过吗? 我的另一个想法是使用JNI与C绑定Python的沟通。

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

Answer 1:

为什么不使用Jython的 ? 唯一的缺点我能马上想到的是,如果你的库使用CPython的原生扩展。

编辑:如果你可以使用的Jython,现在认为你可能有与库的更高版本的问题,我建议你尝试从您的应用程序库(如某种适配器接口的)隔离。 与暂时工作的最简单的事情去了,然后再考虑JNI / CPython中的/ etc如果当你永远需要。 有一点要由去的(痛苦)的JNI路线,除非你真的要来获得。



Answer 2:

坦率地说很多方面以某种方式运行Python直接在JVM不起作用 。 他们要么没有,相当兼容(您的第三方库可以使用Python 2.6功能的新版本,将无法使用Jython 2.5工作)或哈克(它将与神秘的JVM堆栈跟踪不是真的导致解决方案打破)。

我的首选方式整合两家将使用RPC。 XML RPC是个不错的选择,在这里,如果你有适量的数据。 这是很好的支持 - Python有它的标准库。 Java库也很容易找到。 现在,根据您的设置Java或Python的部分是从其他语言的服务器接受连接。

一个不太受欢迎,但值得考虑的另一种方式做RPC的谷歌protobuffers,其具有的支持2/3 不错的RPC 。 你只需要提供您的传输层。 没有那么多的工作和写作的便利性是合理的。

另一种方法是围绕写一个C包装,Python的功能块,你需要暴露在Java和JVM通过本地插件使用。 您可以通过使用SWIG去缓解疼痛痛饮 。

基本上在你的情况下,它的工作原理类似:

  1. 创建从Java到C ++所有方法调用了一大口接口。
  2. 创建C / C ++代码,将收到您的电话和内部调用右PARAMS Python解释器。
  3. 转换响应从蟒蛇获得,并通过痛饮发回给你的Java代码。

该解决方案是相当复杂的,在大多数情况下,有点矫枉过正。 不过,如果你(出于某种原因)不能承受的RPC这是值得做的事情。 RPC仍然是我的首选,虽然。



Answer 3:

许多年以后,我想补充一个选项,这是更受追捧...

如果您需要CPython的功能, py4j是一个不错的选择。 py4j已经看到看到频繁的更新中 2016 2017年取得了一定的人气,因为它是用来例如由阿帕奇星火实现CPython的互操作性 。



Answer 4:

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

我很喜欢JNA :

JNA提供了Java程序方便地访问本地共享库(在Windows DLL)中不写任何东西,但需要Java代码,没有JNI或本地代码。 此功能相当于Windows的平台/调用和Python的ctypes的。 访问是在运行时动态无代码生成。

我的0.02 $ :)



Answer 5:

你可以使用像一个消息服务的ActiveMQ 。 它既有的Python和Java支持。 通过这种方式,你可以离开了复杂的JNI或C绑定,因为它们只和与我考虑一个简单的界面处理。 此外,当库被更新,你不需要如果有什么太大变化。



Answer 6:

你有没有考虑运行Jython中的Java VM?



Answer 7:

我已经研究了JNI类似的设置。 也许这将帮助,如果还没有看到它尚未:

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

http://jpe.sourceforge.net/



Answer 8:

如果你能得到你的Python代码在Jython的工作,那么你应该能够用它来从Java调用它:

  • http://jython.sourceforge.net/cgi-bin/faqw.py?req=show&file=faq06.001.htp


文章来源: Java Python Integration