在J内部使用Python
可能重复:
Java Python集成
我有一个使用100%Java编写的大型现有代码库,但是我想在它的一些新部分中使用Python。 我需要进行一些文本和语言处理,而我宁愿使用Python和类似NLTK的库来执行此操作。
我知道Jython项目,但这似乎代表了一种从Python内部使用Java及其库的方法,而不是相反的方式-我对此是否错?
如果没有,那么在Java和Python之间进行交互的最佳方法是什么,这样(理想情况下)我就可以在Python中调用方法并将结果返回给Java?
谢谢。
Liam asked 2019-10-15T13:40:22Z
7个解决方案
36 votes
我知道Jython项目,但是 看起来这代表了一种方法 从内部使用Java及其库 Python,而不是其他方式 一轮-我对此有误吗?
是的,你错了。 您可以调用命令行解释器以使用Jyton运行python代码,也可以使用Java中的python代码。 过去也有一个python-to-Java编译器,但Jython 2.2终止了该编译器。
Michael Borgwardt answered 2019-10-15T13:40:43Z
6 votes
我将编写一个Python模块来处理文本和语言处理,然后在jython中构建一个小的桥梁,您的Java程序可以与之交互。 jython桥将是一个非常简单的桥,它实际上仅负责将调用转发到python模块,并将答案从python模块返回到java模块。 Jython确实非常易于使用,并且设置时间不会超过15分钟。
祝你好运!
Mia Clarke answered 2019-10-15T13:41:09Z
4 votes
我认为您不能使用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
我从来没有使用过这些项目,所以我不能保证它们的质量。
Carlos Santos answered 2019-10-15T13:42:09Z
2 votes
Jython是在JVM上运行的Python实现。 您可以在用户指南中找到有关在现有Java应用程序中嵌入Python的信息。
我不知道您正在使用的环境,但是请注意,在同一应用程序中混合使用语言会很快导致混乱。 我建议创建Java接口来表示您打算使用的操作,以及包装Python代码的单独包装的实现类。
kdgregory answered 2019-10-15T13:42:42Z
2 votes
我认为,Jython正是您所需要的。
它是JVM中Python的实现; 这样,您可以自由交换对象,例如,从Java类继承(有一些限制)。
注意,它的主要优点(位于JVM之上)也是它的主要缺点,因为它不能使用所有用C(或任何其他编译语言)编写的(C)Python扩展。 这可能会影响您对文本处理的意愿。
有关什么是Jython,其潜力和局限性的更多信息,建议您阅读Jython常见问题解答。
rob answered 2019-10-15T13:43:29Z
0 votes
只需从Java内部将Python解释器作为子进程运行即可。
将Python功能编写为适当的脚本,该脚本可从stdin读取并写入stdout。
使用Java Runtime类产生运行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" )
该界面简单,结构化且开销非常低。
S.Lott answered 2019-10-15T13:44:19Z
0 votes
请记住,首先请那些为开发付费的人核对它们是否适合需要一个从现在开始就了解Python和Java的开发人员,以及无疑已经考虑到的其他成本和可维护性影响的开发人员。
参见:[http://www.acm.org/about/se-code] 1.06、2.03、2.09、4.03、4.05、6.07
Mikael Gueck answered 2019-10-15T13:44:51Z