Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用Python_Java_Python_Jython_Rpc - Fatal编程技术网

在Java中使用Python

在Java中使用Python,java,python,jython,rpc,Java,Python,Jython,Rpc,可能重复: 我有一个用100%Java编写的大型现有代码库,但我想在它的一些新部分中使用Python。我需要做一些文本和语言处理,我更愿意使用Python和类似的库来完成这项工作 我知道Jython项目,但它似乎代表了一种从Python内部使用Java及其库的方法,而不是相反的方法——我错了吗 如果不是,那么什么是Java和Python之间接口的最佳方法,这样(理想情况下)我可以调用Python中的方法并将结果返回给Java 谢谢。只需从Java内部将Python解释器作为子进程运行即可 将P

可能重复:

我有一个用100%Java编写的大型现有代码库,但我想在它的一些新部分中使用Python。我需要做一些文本和语言处理,我更愿意使用Python和类似的库来完成这项工作

我知道Jython项目,但它似乎代表了一种从Python内部使用Java及其库的方法,而不是相反的方法——我错了吗

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


谢谢。

只需从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" )

该接口简单、结构化,开销非常低。

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


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

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

祝你好运

我知道Jython项目,但是 看起来这代表了一种 从内部使用Java及其库 Python,而不是相反的方式 我错了吗


是的,你错了。您可以使用Jyton或运行python代码。过去也有python-to-Java编译器,但是Jython 2.2停止了它。在我看来,Jython正是您所看到的。
它是JVM中Python的一个实现;因此,您可以自由地交换对象,例如,从Java类继承对象(有一些限制)

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


关于什么是Jython、它的潜力和局限性的更多信息,我建议您阅读。

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

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

sourceforge.net/projects/jpype/

pypi.python.org/pypi/javaclass/0.1


我从未使用过这些项目中的任何一个,因此我不能保证它们的质量。

请记住,首先从支付开发费用的人那里检查一下,他们是否同意代码库需要一个从现在起既懂Python又懂Java的开发人员,以及您无疑已经考虑到的其他成本和可维护性影响


参见:1.06、2.03、2.09、4.03、4.05、6.07。。。如果你成功了,也许停下来问我的问题,给它一些爱。。。er回答:这不是一种很好的方式来连接2,他们将无法在Pyton中调用方法并在Java中输出。我想说接口与clean相反,由于通信是完全非结构化的,并且需要额外的解析逻辑。同意:使用Java运行时可能会有点混乱:除非您真的必须这样做,否则请避免。您必须小心不要引入可移植性问题,您必须处理退货状态;您可能必须处理行为不端的流程等;这样做会让你失去很多控制。谢谢-我最喜欢界面解释器方法,但我必须打电话询问我是否能承受与编译方法相比的性能损失。但是,感谢您和所有的回答者。为了补充一点,jythonc方法已经被弃用,转而直接调用python解释器来解决问题,您仍然需要在您的系统中安装python环境/库/etc?对于那些看到这个答案的人,记住这是09年和jythonc的。这个答案在2017年仍然有效吗,也就是说,更喜欢使用口译员?我喜欢这个想法。你能举出一个例子吗?或者,当你可以使用Process.exec或ProcessBuilder时,为什么你需要jython调用python脚本