61

可能重复:
Java Python 集成

我有一个用 100% Java 编写的大型现有代码库,但我想将 Python 用于其中的一些新部分。我需要做一些文本和语言处理,我更愿意使用 Python 和像NLTK这样的库来做这件事。

我知道 Jython 项目,但看起来这代表了一种在 Python 中使用 Java 及其库的方式,而不是反过来——我错了吗?

如果不是,那么在 Java 和 Python 之间进行接口的最佳方法是什么,这样(理想情况下)我可以在 Python 中调用一个方法并将结果返回给 Java?

4

7 回答 7

34

我知道 Jython 项目,但看起来这代表了一种在 Python 中使用 Java 及其库的方式,而不是反过来——我错了吗?

是的,你错了。您可以调用命令行解释器以使用 Jyton 运行 python 代码,也可以使用来自 Java的 python 代码。过去还有一个 python-to-Java 编译器,但它在 Jython 2.2 中停止了

于 2009-07-22T12:14:05.303 回答
6

我会编写一个 Python 模块来处理文本和语言处理,然后在 jython 中构建一个小桥,您的 java 程序可以与之交互。jython 桥将是一个非常简单的桥,它实际上只负责将调用转发到 python 模块,并将 python 模块的答案返回给 java 模块。Jython 非常易于使用,安装时间不会超过 15 分钟。

祝你好运!

于 2009-07-22T12:12:29.500 回答
4

我认为您不能使用 Jython 的 NLTK,因为它依赖于未移植到 JVM 的 Numpy。如果您需要 NLTK 或任何其他本机 CPython 扩展,您可以考虑使用一些 IPC 机制在 CPython 和 JVM 之间进行通信。话虽如此,有一个项目允许从 Java 调用 CPython,名为 Jepp:

http://jepp.sourceforge.net/

反过来(从 CPython 调用 Java 代码)是 JPype 和 javaclass 的目标:

sourceforge.net/projects/jpype/

pypi.python.org/pypi/javaclass/0.1

我从来没有使用过这些项目中的任何一个,所以我不能保证它们的质量。

于 2009-07-22T15:21:17.770 回答
2

Jython 是在 JVM 上运行的 Python 实现。您可以在用户指南中找到有关在现有 Java 应用程序中嵌入 Python 的信息。

我不知道您正在工作的环境,但请注意,在同一个应用程序中混合语言会很快导致混乱。我建议创建 Java 接口来表示您计划使用的操作,以及包装 Python 代码的单独打包的实现类。

于 2009-07-22T12:11:43.027 回答
2

在我看来,Jython 正是您所看到的。
它是JVM 中的 Python实现;因此,您可以自由地交换对象,例如,从 Java 类继承(有一些限制)。

请注意,它的主要优势点(位于 JVM 之上)也是它的主要缺点,因为它不能使用用 C(或任何其他编译语言)编写的所有 (C)Python 扩展;这可能会影响您愿意对文本处理进行的操作。

有关什么是 Jython、它的潜力和局限性的更多信息,我建议您阅读Jython 常见问题解答

于 2009-07-22T12:29:52.033 回答
0

只需从 Java 中将 Python 解释器作为子进程运行。

将您的 Python 功能编写为适当的脚本,该脚本从标准输入读取并写入标准输出。

使用 JavaRuntime类生成一个运行 Python 脚本的子进程。这非常简单,并且提供了一个非常干净的界面。


编辑

import simplejson
import sys
for request in sys.stdin.readlines():
    args = simplejson.loads( request )
    result = myFunction( args['this'], args['that'] )
    sys.stdout.writeline( simplejson.dumps( result ) + "\n" )

界面简单、结构化且开销极低。

于 2009-07-22T12:10:31.483 回答
0

请记住,首先要向那些支付开发费用的人核实,他们是否可以接受需要从现在开始同时了解 Python 和 Java 的开发人员的代码库,以及您无疑已经考虑到的其他成本和可维护性影响。

参见:http : //www.acm.org/about/se-code 1.06、2.03、2.09、4.03、4.05、6.07

于 2009-07-22T17:45:24.067 回答