Java Python Integration

2022-08-31 17:13:33

我有一个Java应用程序需要与第三方库集成。该库是用Python编写的,我对此没有任何发言权。我试图找出与它集成的最佳方式。我正在尝试JEPP(Java Embedded Python) - 以前有人用过吗?我的另一个想法是使用JNI与Python的C绑定进行通信。

任何关于最佳方法的想法将不胜感激。谢谢。


答案 1

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

编辑:如果你现在可以使用Jython,但认为你可能对更高版本的库有问题,我建议你尝试将库与你的应用程序隔离开来(例如,某种适配器接口)。选择目前最简单的方法,然后在需要时考虑JNI / CPython / etc。走(痛苦的)JNI路线几乎没有什么好处,除非你真的必须这样做。


答案 2

坦率地说,以某种方式直接从JVM中运行Python的大多数方法都不起作用。它们要么不完全兼容(你的第三方库的新版本可以使用python 2.6功能,并且不能与Jython 2.5一起使用),要么与黑客(它会与神秘的JVM stacktrace一起破坏,而不是真正导致解决方案)。

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

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

另一种选择是围绕Python功能的各个部分编写一个C包装器,您需要向Java公开并通过JVM本机插件使用它。您可以通过使用SWIG SWIG来缓解疼痛。

基本上,在你的情况下,它的工作原理是这样的:

  1. 为从 Java 到 C++ 的所有方法调用创建 SWIG 接口。
  2. 创建C / C++代码,该代码将接收您的呼叫,并在内部调用具有正确参数的python解释器。
  3. 转换从python获得的响应,并通过swig将其发送回Java代码。

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