Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Python集成_Java_Python_Integration - Fatal编程技术网

Java-Python集成

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

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


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

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

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

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

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

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


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

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


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


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


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


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

您可以使用类似的消息服务。它同时支持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仍然是我的首选。

    坦率地说大多数直接从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仍然是我的首选

    我的另一个