Java Python 集成

2025-03-05 09:17:00
admin
原创
93
摘要:问题描述:我有一个 Java 应用程序需要与第三方库集成。该库是用 Python 编写的,我对此没有任何发言权。我正在尝试找出与其集成的最佳方法。我正在尝试 JEPP(Java 嵌入式 Python)——有人用过吗?我的另一个想法是使用 JNI 与 Python 的 C 绑定进行通信。如果您有关于如何最好地实...

问题描述:

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

如果您有关于如何最好地实现这一点的想法,我将不胜感激。谢谢。


解决方案 1:

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

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

解决方案 2:

坦白说,大多数以某种方式直接从 JVM 内部运行 Python 的方法都行不通。它们要么不太兼容(第三方库的新版本可以使用 Python 2.6 功能,并且无法与 Jython 2.5 一起使用),要么是黑客行为(它会因神秘的 JVM 堆栈跟踪而中断,而无法真正解决问题)。

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

一个不太流行但值得考虑的替代 RPC 方法是 Google protobuffers,它对nice rpc的支持率为 2/3 。你只需要提供你的传输层。不需要做太多工作,而且编写起来很方便。

另一种选择是编写一个 C 包装器来包装您需要向 Java 公开的 Python 功能,并通过 JVM 本机插件使用它。您可以使用 SWIG SWIG来减轻这种痛苦。

本质上,就你的情况而言,它的工作原理是这样的:

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

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

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

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

解决方案 3:

多年后,只是为了增加一个现在更受欢迎的选项......

如果你需要 CPython 功能,py4j是一个不错的选择。py4j 已经频繁更新2016 2017 2018 20192020 年它获得了一定的普及,因为 Apache Spark 等使用它来实现CPython 互操作性。

解决方案 4:

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

这里列出了为此目的使用的完整模块的一个小列表:Python 模块

  • 烧瓶

  • Flask-SQLAlchemy

  • Flask-Restful

  • SQLite3 的

  • Jsonify

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

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

解决方案 5:

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

我非常喜欢JNA:

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

我的 0.02 美元 :)

解决方案 6:

您可以使用ActiveMQ之类的消息服务。它同时支持Python和 Java。这样,您就可以保留复杂的 JNI 或 C 绑定,而只处理我认为简单的接口。此外,当库更新时,您不需要做太多更改。

解决方案 7:

您是否考虑过在 Java VM 上运行Jython ?

解决方案 8:

我已经研究过类似的 JNI 设置。如果你还没有看到过,也许这会有所帮助:

http://wiki.cacr.caltech.edu/danse/index.php/Communication_ Between_Java_and_Python

http://jpe.sourceforge.net/

解决方案 9:

这些是使弥合 Python 和 Java 之间差距变得更容易的一些工具:

  1. Java 中实现的Jython Python

  1. JPype
    允许 Python 运行 Java 命令

  1. Jepp
    Java 嵌入 Python

  1. JCC
    是一个用于从 C++/Python 调用 Java 的 C++ 代码生成器

  1. Javabridge 是
    一个用于在 CPython 中运行并与 JVM 交互的包

  1. py4j
    允许 Python 运行 java 命令。

7.voc BeeWare 套件的一部分
。将 Python 代码转换为 Java 字节码。

8、p2j
将 Python 代码转换为 Java。不再开发。

解决方案 10:

如果您可以让 Python 代码在 Jython 中运行,那么您应该可以使用它来从 Java 中调用它:

解决方案 11:

我还认为在 Java 中运行命令行不是一个好习惯(stackoverflow 问题在这里)。可能会通过某些数据库共享数据。

我喜欢通过bash 管道连接两个应用程序的方式,但我没有这方面实践过,所以我想知道在 python/java 两端编写逻辑来处理这个问题有多难。

或者其他有效的方法是使用支持过程编程的远程过程调用 ( RPC )。使用 RPC,您可以在共享环境中调用方法。例如,您可以使用 RPC 从本地计算机调用远程计算机中的函数。我们可以将 RPC 定义为分布式系统中的一种通信类型。
(Marcin 在上面提到过)

或者,非常幼稚的方式是通过公共文件进行通信。但为了简单和速度,我建议使用共享数据库x rest API x套接字通信

我也喜欢Marcin 写的XML RPC 。

我建议避免在 JVM 或 C++ 绑定下运行 Python 的任何复杂情况。最好使用当今的趋势,这显然是 Web 技术。

作为共享数据库,MongoDB 可能是个好的解决方案,或者Redis 作为内存数据库更好。

解决方案 12:

使用管道通过子进程与python(python脚本调用python库)进行通信,整个过程就像java<-> Pipes <-> py

如果使用 JNI,您应该熟悉 python 的绑定(不推荐)和编译文件,就像*.so使用 java 一样。整个过程就像py -> c -> .so/.pyd -> JNI -> jar

这里有一个关于 stdio 的很好实践。https
://github.com/JULIELab/java-stdio-ipc

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3975  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2742  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   80  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   88  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   77  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用