为了账号安全,请及时绑定邮箱和手机立即绑定

Java Python集成

Java Python集成

PIPIONE 2019-10-08 15:11:31
我有一个Java应用程序,需要与第三方库集成。该库是用Python编写的,对此我没有任何发言权。我正在尝试找出与之集成的最佳方法。我正在尝试JEPP(Java嵌入式Python)-以前有人使用过吗?我的另一个想法是使用JNI与Python的C绑定进行通信。任何关于最好的方法的想法将不胜感激。谢谢。
查看完整描述

4 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

为什么不使用Jython?我唯一能想到的缺点就是您的库是否使用CPython本机扩展。


编辑:如果您现在可以使用Jython,但认为您可能在库的更高版本中遇到问题,建议您尝试将库与应用程序隔离(例如某种适配器接口)。选择目前最简单的方法,然后在需要时考虑使用JNI / CPython / etc。除非确实需要,否则通过(痛苦的)JNI路线几乎无济于事。


查看完整回答
反对 回复 2019-10-08
?
呼如林

TA贡献1798条经验 获得超3个赞

坦白说,大多数直接从JVM内部运行Python的方法都行不通。它们要么不完全兼容(您的第三方库的新版本可以使用python 2.6功能,并且不能与Jython 2.5一起使用),要么它们很hacky(它将与隐秘的JVM stacktrace断开,并不会真正导致解决方案)。

我首选的将两者集成的方法是使用RPC。如果数据量适中,那么XML RPC在这里不是一个不错的选择。它得到了很好的支持-Python在其标准库中提供了它。Java库也很容易找到。现在,根据您的设置,Java或Python部分将是接受来自其他语言的连接的服务器。

Google protobuffers是一种较不流行但值得考虑的替代方法,它是Google protobuffers,它对rpc有2/3的支持。您只需要提供您的传输层。没有那么多的工作和写作的便利是合理的。

另一个选择是围绕需要公开给Java并通过JVM本机插件使用的那部分Python功能编写一个C包装器。您可以通过使用SWIG SWIG减轻痛苦 。

从本质上来说,它的工作原理如下:

  1. 为从Java到C ++的所有方法调用创建一个SWIG接口。

  2. 创建将接收您的调用的C / C ++代码,并使用正确的参数在内部调用python解释器。

  3. 转换从python获得的响应,并通过swig发送回Java代码。

该解决方案相当复杂,在大多数情况下有点过头了。如果您(出于某种原因)买不起RPC,仍然值得做。不过,RPC仍然是我的首选。


查看完整回答
反对 回复 2019-10-08
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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


我非常喜欢JNA:


JNA使Java程序无需编写Java代码即可轻松访问本机共享库(Windows上的DLL),而无需编写Java代码-无需JNI或本机代码。此功能可与Windows的Platform / Invoke和Python的ctype相媲美。访问在运行时是动态的,无需代码生成。

我的0.02 $ :)


查看完整回答
反对 回复 2019-10-08
?
九州编程

TA贡献1785条经验 获得超4个赞

您可以使用ActiveMQ之类的消息传递服务。它同时具有Python和Java支持。这样,您可以保留复杂的JNI或C绑定,而仅处理我认为简单的接口。此外,当库更新时,您无需进行太多更改(如果有的话)。


查看完整回答
反对 回复 2019-10-08
  • 4 回答
  • 0 关注
  • 588 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信