从Java内使用Python

可能重复:
Java Python集成

我有一个用100%Java编写的大型现有代码库,但是我想用Python来创build一些新的代码段。 我需要做一些文本和语言处理,我宁愿使用Python和像NLTK这样的库来做到这一点。

我知道Jython项目,但它看起来像是从Python内部使用Java及其库的方式,而不是相反的方式 – 我错了吗?

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

谢谢。

我知道Jython项目,但它看起来像是从Python内部使用Java及其库的方式,而不是相反的方式 – 我错了吗?

是的,你错了。 您可以调用命令行解释器来使用Jyton运行python代码,也可以使用Java中的python代码 。 过去也有一个python到Java的编译器,但是用Jython 2.2取消了

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

祝你好运!

我不认为你可以从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

我从来没有使用这些项目,所以我不敢发誓。

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

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

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

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

有关Jython,它的潜力和局限性的更多信息,我build议你阅读Jython FAQ 。

只需从Java内部运行Python解释器作为子stream程。

把你的Pythonfunction写成一个正确的脚本,它从标准input读取并写入标准输出。

使用Java Runtime类产生一个运行你的Python脚本的subprocess。 这很简单,并提供一个非常干净的界面。


编辑

 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" ) 

界面简单,结构合理,开销很低。

记得先从开发者那里检查一下,他们没问题,需要一个开发人员从现在开始同时知道Python和Java,而其他的成本和可维护性效果已经占了上风。

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