40

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

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

任何指针?(仅供参考,我是 Python 新手)

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

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

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

4

6 回答 6

68

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

您也可以使用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 的作者

于 2010-09-25T10:51:57.410 回答
11

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

于 2009-01-25T00:46:46.043 回答
6

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

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

对于包装,您可以使用 jython(只有在您熟悉 python 时才有意义

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

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

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

于 2009-01-25T10:50:46.837 回答
5

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

于 2009-02-04T12:18:07.250 回答
4

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

于 2009-02-04T12:38:23.030 回答
2

试试 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。

于 2009-02-04T12:54:28.190 回答