Jython:在 Java 程序里运行 Python 代码

笔者:彭大
有任何疑问欢迎关注微信公众号:网易游戏运维平台。(长按识别上图二维码)
微信公众号原文链接:Jython:在 Java 程序里运行 Python 代码
教你如何使用 Jython 在 Java 程序中嵌入 Python 代码。
前言
众所周知,JVM 在大数据基础架构领域可以说是独占鳌头,当我们需要开发大数据处理的相关组件时,首先会想到要使用的语言便是 Java 和 Scala。相比于 Java,Scala 的代码会更加简洁,但也有着高得多的入门门槛,因此为了保证核心组件的稳定和易于维护,我们多数时候都会更倾向于使用 Java 进行开发。
不过,组件中相对稳定的基本功能和框架尚且不谈,对于那些需要快速灵活变化的部分,使用 Java 进行开发则会有些捉襟见肘。例如,我们在为业务方开发一套通用的实时作业时,业务方需要作业在特定的处理环节中支持通过配置自定义的代码来指定算子的行为,并且在配置发生变化时需要可以在不重启实时作业的情况下进行热更新。直接使用 Java 实现这样的功能无疑会有点力不从心,为此我们就需要借助动态语言的力量了。
实际上,在 JVM 平台上使用动态语言的场景并不少见:Groovy 便是为此而生的一门语言。尽管在部分场景下 Groovy 确实是不错的选择,但对于大数据分析来说,Groovy 并不为多数数据开发人员所熟知,相比之下 Python 会是更好的选择。
目前也有不少的大数据框架支持用户提交运行 Python 代码:
- Hadoop MapReduce 借助 Hadoop Streaming,使用标准输入流和标准输出流进行进程间的数据交换,可以运行包括 Python 在内任意语言写成的可执行文件
- Apache Spark 提供了
pyspark编程入口,其使用了 Py4J 来实现 JVM 与 Python 进程间的高效数据传输 - Apache Flink 则使用了 Jython 来运行用户的 Python 代码。
最终,我们选择了使用 Jython 来实现这样的功能。Jython 类似于 Groovy,能够与宿主 Java 程序在同一个 JVM 进程中运行,相比于 Hadoop Streaming 或是 Py4J 的方案减少了进程间数据传输的损耗,以换来更高的性能。
但在使用 Jython 的时候我们仍然需要注意几点:
- 部分 PyPI 包可能无法在 Jython 中运行,尤其是那些包含 C 语言扩展的包
- 和 Groovy 一样,随意地使用 Jython 可能会导致内存泄漏
目前,Jython 已在 2017 年 6 月发布了 2.7.1 版,支持所有 Python 2.7 语法。尽管距离其上一次发布更新已经过去了很长一段时间,但如果你有兴趣看一下它的源代码仓库的话,你会发现它仍在持续迭代中。
Jython 基本使用
本文剩下的内容会集中介绍如何在 Java 程序中使用 Jython。关于其他使用 Jython 的方式,可以参考 Jython 官方给出的 Jython Book,这里我们便不再赘述。
实际上,Jython 的官方文档也给出了在 Java 中嵌入 Jython 的基本示例,极其简单:
import org.python.util.PythonInterpreter;
import org.python.core.*;
public class SimpleEmbedded {
public static void main(String[] args) throws PyException {
PythonInterpreter interp = new PythonInterpreter();
System.out.println("Hello, brave new world");
interp.exec("import sys");
interp.exec("print sys"

本文介绍了如何使用Jython在Java程序中嵌入并运行Python代码,以实现快速灵活的功能扩展。Jython允许Java程序与Python代码交互,避免了进程间数据传输的损耗。文章讨论了Jython的使用注意事项,如避免频繁创建`PythonInterpreter`对象以防止内存泄漏,以及如何引入PyPI包。虽然存在限制,但Jython仍然是在Java中运行Python代码的一个可行选择。
最低0.47元/天 解锁文章
266

被折叠的 条评论
为什么被折叠?



