Java-Python集成

Java-Python集成,java,python,integration,Java,Python,Integration,我有一个Java应用程序需要与第三方库集成。这个库是用Python编写的,对此我没有任何发言权。我正试图找出与之整合的最佳方式。我正在试用JEPP(Java嵌入式Python)——以前有人用过吗?我的另一个想法是使用JNI与Python的C绑定通信 如果您有任何关于最佳方式的想法,我们将不胜感激。谢谢。您考虑过在Java虚拟机上运行吗?为什么不使用?我能马上想到的唯一缺点是,如果您的库使用CPython本机扩展 编辑:如果您现在可以使用Jython,但认为在更新版本的库中可能存在问题,我建议您尝

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


如果您有任何关于最佳方式的想法,我们将不胜感激。谢谢。

您考虑过在Java虚拟机上运行吗?

为什么不使用?我能马上想到的唯一缺点是,如果您的库使用CPython本机扩展


编辑:如果您现在可以使用Jython,但认为在更新版本的库中可能存在问题,我建议您尝试将库与应用程序隔离(例如,某种适配器接口)。与最简单的事情一起工作,然后考虑JNI/CPython等,如果你需要的话。除非你真的必须这样做,否则走(痛苦的)JNI路线不会有什么好处。

如果你能让你的Python代码在Jython中工作,那么你应该能够使用它从Java调用它:


我研究了JNI的类似设置。如果您还没有看到,这可能会有所帮助:


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

坦率地说大多数直接从JVM中运行Python的方法都不起作用。它们要么不太兼容(您的第三方库的新版本可以使用python 2.6功能,不能与Jython 2.5一起使用),要么不兼容(它将与神秘的JVM stacktrace决裂,而不是真正的解决方案)

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

一种不太受欢迎但值得考虑的RPC替代方法是GoogleProtoBuffers,它有2/3的RPC支持。您只需要提供传输层。没有那么多的工作和方便的写作是合理的

另一种选择是围绕需要向Java公开并通过JVM本机插件使用的Python功能编写C包装。你可以通过痛饮来缓解疼痛

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

< L>为java到C++的所有方法调用创建一个Sigg接口。
  • 创建将接收调用的C/C++代码,并使用正确的参数在内部调用python解释器
  • 转换从python获得的响应,并通过swig将其发送回Java代码
  • 这个解决方案相当复杂,在大多数情况下有点过分。但是,如果你(出于某种原因)买不起RPC,这仍然是值得的。不过,RPC仍然是我的首选

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

    我非常喜欢:

    JNA为Java程序提供了对本机共享库(Windows上的DLL)的轻松访问,无需编写除Java代码以外的任何内容—无需JNI或本机代码。此功能与Windows的平台/调用和Python的ctypes相当。访问在运行时是动态的,无需生成代码

    我的0.02$:)

    许多年后,只是为了添加一个现在更流行的选项


    如果您需要CPython功能,这是一个很好的选择。py4j在2016年、2017年、2018年、2019年、2020年频繁更新,并获得了一定的普及,因为它被Apache Spark用来实现。

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

    以下是用于此目的的完整模块的小列表: Python模块

    • 烧瓶
    • 烧瓶炼金术
    • 长颈瓶
    • SQlite3
    • Jsonify
    Java模块(用于调用RESTAPI) Jersey或Apache CXF


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

    以下是一些可以更轻松地弥合Python和Java之间差距的工具:

    一,。 用Java实现的Python

    二,。 允许Python运行java命令

    三,。 Java嵌入式Python

    四,。 一个C++代码生成器,用于从C++调用Python < /P> java 五,。 用于运行和与来自CPython的JVM交互的包

    六,。 允许Python运行java命令

    七,。 是啤酒套装的一部分。将python代码转换为Java字节码

    八,。
    将Python代码转换为Java。不再开发。

    如果python库都是用纯python编写的,那么使用Jython怎么样?IronPython是用于.NET的,而不是Java。IKVM可以潜在地将这三者结合起来,但ick:)我是否在其他地方遗漏了对IronPython的引用?是的——在Cletus编辑之前的回答中。(编辑没有显示,因为它是在最初几分钟内显示的。)我已经查看了Jython库。问题是我不能保证我正在使用的库不会(或者将来不会)使用本机扩展,我会这样做。谢谢我是否需要向py文件中添加任何特殊内容才能使用Jython运行它?或者,如果它是本地python,它应该运行吗?我对Jython没有太多经验-请查阅文档:)就可以了,感谢您的帮助。这种非JVM兼容性是python最大的缺点。这就是我们决定使用Scala的原因。Marcin,远程调用方式不适合大数据实现(算法或应用程序)