Java Python集成

Jef*_*rey 50 python java integration

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

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

Jon*_*eet 38

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

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


Mar*_*cin 19

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

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

一个不那么受欢迎但值得考虑的另一种做RPC的方法是Google protobuffers,它有很好的rpc支持的2/3 .您只需提供传输层即可.没那么多的工作和写作的便利是合理的.

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

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

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

这个解决方案相当复杂,在大多数情况下有点过分.如果你(出于某种原因)无法负担RPC,那么值得做.但RPC仍然是我的首选.

  • 这种非JVM兼容性是Python的最大缺点.这就是我们决定使用Scala的原因.它甚至更好. (5认同)

blu*_*e10 13

许多年后,只是添加一个更受欢迎的选项......

如果你需要CPython功能,py4j是一个不错的选择.py4j已经看到频繁的更新20162017年并且已经获得了一些普及,因为它被例如Apache Spark用于实现CPython互操作性.

  • 这是一个比Jython更好的选择,它是技术上的死胡同,而且似乎不再维护了。 (2认同)

dfa*_*dfa 7

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

我非常喜欢JNA:

JNA为Java程序提供了对本机共享库(Windows上的DLL)的轻松访问,而无需编写除Java代码之外的任何内容 - 不需要JNI或本机代码.此功能可与Windows的Platform/Invoke和Python的ctypes相媲美.访问在运行时是动态的,无需生成代码.

我的0.02美元:)


Pas*_*res 6

最好的解决方案,是使用 Python 程序抛出 REST API。您定义您的服务并调用它们。您可能需要学习一些新模块。但是你会更灵活地应对期货的变化。

这里有一小部分用于此目的的完整模块:Python 模块

  • 烧瓶
  • Flask-SQLAlchemy
  • Flask-Restful
  • SQlite3
  • jsonify

Java 模块(用于调用 rest api) Jersey 或 Apache CXF

您将需要一个小的学习曲线,但稍后您将获得更高的生产力和模块化,甚至弹性......


geo*_*wa4 5

您可以使用像ActiveMQ这样的消息服务.它同时支持Python和Java.这样,您可以保留复杂的JNI或C绑定,并且只处理我认为简单的接口.此外,当库得到更新时,您无需进行太多更改(如果有的话).