【问题标题】:Using a java library from python使用 python 中的 java 库
【发布时间】:2010-10-03 09:09:05
【问题描述】:

我有一个 python 应用程序和一个 java 应用程序。 python 应用程序为 java 应用程序生成输入并在命令行上调用它。

我确信必须有一个更优雅的解决方案;就像使用 JNI 从 Java 调用 C 代码一样。

有什么建议吗? (仅供参考,我是 Python 新手)

澄清(以一个很长的问题为代价:道歉) py 应用程序(我不拥有)以许多配置文件的形式获取用户输入。然后它通过插件机制解释这些和农场工作到许多(隐藏的)工具。我希望添加对旧版 Java 应用程序提供的功能的支持。

所以从 java 应用程序调用 python 应用程序是没有意义的,我无法在 jython 环境中运行 py 应用程序(在 JVM 上)。

由于没有明显的机制,我认为简单的 CL 调用是最好的解决方案。

【问题讨论】:

标签: java python jython


【解决方案1】:

看看Jython。它有点像 JNI,但将 C 替换为 Python,即您可以从 Java 调用 Python,反之亦然。目前尚不清楚您要做什么,或者为什么您当前的方法不是您想要的。

【讨论】:

  • Jython 与 JNI 不同,因为它在 VM 中运行。
  • Jython 比 CPython 慢得多。在现实世界中,我们无法使用 Jython 运行我们的 Python 程序。
  • 直到今天,Jython 仅适用于 Python 2.7,不适用于 Python 3.x。
【解决方案2】:

将您的 Java 代码包装在一个容器(Servlet / EJB)中。

因此,您不会在 vm-startup 上浪费时间,而是走上了更加面向服务的道路。

您可以使用 jython 进行包装(只有在您熟悉 python 时才有意义

选择一个python和java都可以使用的通信协议:

  • json(见 www.json.org)
  • rmi (Python: JPype)
  • 休息
  • SOAP(只为勇敢者)

选择您或您的合作伙伴熟悉的东西!

【讨论】:

    【解决方案3】:

    如果您真的想在 Python 进程中嵌入 Java 应用程序,请查看 JPype。它通过 JNI 提供对 Java 的访问。

    【讨论】:

      【解决方案4】:

      使用 swig 怎么样:http://www.swig.org/Doc1.3/Java.html

      【讨论】:

        【解决方案5】:

        试试 JCC http://pypi.python.org/pypi/JCC/2.1

        JCC 是一个代码生成器,用于直接从 CPython 调用 Java。它支持 OS X、Linux、Solaris 和 Windows 上的 CPython 2.3+、多个 JRE(Sun JDK 1.4+、Apple JRE 1.4+ 和 OpenJDK 1.7)。它由开源应用程序基金会(OSAF,制作 Chandler 的人)制作,并在 Apache 风格的许可下发布。

        来自包装说明:

        JCC 是一个 C++ 代码生成器,用于生成通过 Java 的本机调用接口 (JNI) 从 CPython 调用 Java 类所需的胶水代码。

        JCC 生成 C++ 包装类,隐藏 JNI 访问以及 Java 内存和对象引用管理的所有血腥细节。

        JCC 生成 CPython 类型,使这些 C++ 类可以从 Python 解释器访问。 JCC 试图通过检测迭代器和属性访问器来使这些 Python 类型成为 Pythonic。也可以向 JCC 声明迭代器和映射。

        【讨论】:

          【解决方案6】:

          很抱歉恢复线程,但没有接受的答案...

          您也可以使用Py4J。头版上有一个示例和大量文档,但本质上,您只需从 Python 代码中调用 Java 方法,就好像它们是 Python 方法一样:

          >>> from py4j.java_gateway import JavaGateway
          >>> gateway = JavaGateway()                        # connect to the JVM
          >>> java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
          >>> other_object = java_object.doThat()
          >>> other_object.doThis(1,'abc')
          >>> gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method
          

          与 Jython 不同,Py4J 在 Python VM 中运行,因此它始终与最新版本的 Python “保持同步”,您可以使用在 Jython 上运行不佳的库(例如 lxml)。通信是通过套接字而不是 JNI 完成的。

          免责声明:我是 Py4J 的作者

          【讨论】:

          • 嗨,巴泰勒米。你能告诉我是否可以使用你的解决方案来处理 EJBCA API 吗?
          • 我正在尝试使用 py4j 加载一个 java 对象(在一个 jar 中)。我使用了一个简单的代码from py4j.java_gateway import JavaGateway; gateway = JavaGateway(); gateway.gateway_parameters.port = 4040; gateway.jvm.java.lang.System.out.println('Hello World!'),但我收到以下错误py4j.protocol.Py4JError: java does not exist in the JVM。你能解释一下我需要在这里做什么吗? Question link
          • 我们可以使用 py4j 使用另一个 JAR 中的 Java 类吗?
          猜你喜欢
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 2015-01-19
          • 2013-03-07
          • 1970-01-01
          • 2023-03-03
          • 2010-09-13
          • 1970-01-01
          相关资源
          最近更新 更多