我有一个需要与第三方库集成Java应用程序。 该库是用Python写的,我没有在任何发言权。 我试图找出与它集成的最佳途径。 我尝试JEPP(Java的嵌入式Python) - 有没有人使用的过吗? 我的另一个想法是使用JNI与C绑定Python的沟通。
在做到这一点的最好办法任何想法,将不胜感激。 谢谢。
我有一个需要与第三方库集成Java应用程序。 该库是用Python写的,我没有在任何发言权。 我试图找出与它集成的最佳途径。 我尝试JEPP(Java的嵌入式Python) - 有没有人使用的过吗? 我的另一个想法是使用JNI与C绑定Python的沟通。
在做到这一点的最好办法任何想法,将不胜感激。 谢谢。
为什么不使用Jython的 ? 唯一的缺点我能马上想到的是,如果你的库使用CPython的原生扩展。
编辑:如果你可以使用的Jython,但现在认为你可能有与库的更高版本的问题,我建议你尝试从您的应用程序库(如某种适配器接口的)隔离。 与暂时工作的最简单的事情去了,然后再考虑JNI / CPython中的/ etc如果当你永远需要。 有一点要由去的(痛苦)的JNI路线,除非你真的要来获得。
坦率地说很多方面以某种方式运行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去缓解疼痛痛饮 。
基本上在你的情况下,它的工作原理类似:
该解决方案是相当复杂的,在大多数情况下,有点矫枉过正。 不过,如果你(出于某种原因)不能承受的RPC这是值得做的事情。 RPC仍然是我的首选,虽然。
许多年以后,我想补充一个选项,这是更受追捧...
如果您需要CPython的功能, py4j是一个不错的选择。 py4j已经看到看到频繁的更新中 2016 2017年取得了一定的人气,因为它是用来例如由阿帕奇星火实现CPython的互操作性 。
我的另一个想法是使用JNI与C绑定Python的沟通。
我很喜欢JNA :
JNA提供了Java程序方便地访问本地共享库(在Windows DLL)中不写任何东西,但需要Java代码,没有JNI或本地代码。 此功能相当于Windows的平台/调用和Python的ctypes的。 访问是在运行时动态无代码生成。
我的0.02 $ :)
你可以使用像一个消息服务的ActiveMQ 。 它既有的Python和Java支持。 通过这种方式,你可以离开了复杂的JNI或C绑定,因为它们只和与我考虑一个简单的界面处理。 此外,当库被更新,你不需要如果有什么太大变化。
你有没有考虑运行Jython中的Java VM?
我已经研究了JNI类似的设置。 也许这将帮助,如果还没有看到它尚未:
http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python
http://jpe.sourceforge.net/
如果你能得到你的Python代码在Jython的工作,那么你应该能够用它来从Java调用它: