0

0

在Java中集成Python机器学习模型

DDD

DDD

发布时间:2025-10-08 09:25:51

|

184人浏览过

|

来源于php中文网

原创

在Java中集成Python机器学习模型

本文详细阐述了如何使用Jython在Java应用程序中集成并调用Python机器学习模型。通过在Java虚拟机(JVM)内部创建Python解释器,我们可以直接执行Python代码、获取Python对象并调用其方法,从而实现Python与Java的无缝交互。文章提供了详细的步骤、示例代码及关键注意事项,特别强调了Jython在处理依赖C扩展的复杂机器学习库时的局限性。

引言

在现代软件开发中,python因其强大的科学计算和机器学习生态系统而备受青睐,而java则以其健壮性、高性能和广泛的企业应用而闻名。将python中开发的机器学习模型集成到java应用程序中,是许多项目面临的常见需求。本文将介绍一种直接在java虚拟机(jvm)中运行python代码的方法——使用jython,来实现这一集成。

Jython:桥接Python与Java的方案

Jython是Python编程语言的一个实现,它运行在Java平台上。这意味着Jython代码可以直接与Java类库进行交互,反之亦然。对于需要在Java应用中直接调用Python逻辑(尤其是那些不依赖于C语言扩展的纯Python实现)的场景,Jython提供了一个优雅的解决方案。

Jython的优势:

  • 直接集成: Python代码在JVM内部运行,无需额外的进程间通信。
  • Java互操作性: Python代码可以导入和使用Java类,Java代码也可以调用Python对象和函数。
  • 简化部署: Python脚本可以打包在Java应用程序中,简化了部署过程。

集成步骤详解

以下是使用Jython在Java中集成Python模型的具体步骤。

1. 准备Python模型代码

首先,我们需要一个包含机器学习逻辑的Python脚本。为了演示,我们创建一个简单的Classifier类,其中包含一个classify方法。

立即学习Java免费学习笔记(深入)”;

classifier_model.py:

# classifier_model.py
class Classifier:
    """
    一个简单的分类器模型示例。
    """
    def classify(self, i: int) -> int:
        """
        对输入进行分类(此处为简单加1操作)。
        """
        print(f"Python: Received input {i}")
        return i + 1

# 在Python脚本中实例化分类器,以便Java可以获取到它
classifier = Classifier()

def main():
    """
    示例主函数,在Python内部测试分类器。
    """
    result = classifier.classify(10)
    print(f"Python: Classification result for 10 is {result}")

if __name__ == "__main__":
    main()

2. 配置Jython依赖

在Java项目中,您需要添加Jython的JAR包作为依赖。如果您使用Maven,可以在pom.xml中添加如下配置:


    org.python
    jython-standalone
    2.7.3 

或者,如果您使用Gradle:

implementation 'org.python:jython-standalone:2.7.3'

3. 初始化Jython解释器并执行Python脚本

在Java代码中,您需要创建一个PythonInterpreter实例来执行Python代码。

iWebMall多用户商城系统
iWebMall多用户商城系统

iWebMall 是一款高性能高扩展能力的开源 LAMP 电子商务软件,定位为大中型电子商务平台软件,服务于有建立电子商务需求的商业客户。这些商业客户不必学习任何计算机编程代码知识,只需要使用 iWebMall 软件他们就可以轻松建立一个功能强大的网上商城,实现用户注册、产品展示、在线定购、在线支付等电子商务功能;iWebMall 集成了产品发布与查询、会员注册登录、购物车、在线订单、在线支付、在

下载
import org.python.core.PyException;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class PythonIntegrationExample {

    public static void main(String[] args) throws PyException {
        // 1. 初始化Python解释器
        PythonInterpreter interp = new PythonInterpreter();

        // 2. 执行Python脚本
        // 假设 classifier_model.py 在项目的classpath下,或者提供完整路径
        // 注意:execfile() 方法会执行整个脚本,并将其中的全局变量和函数加载到解释器环境中。
        // 这里假设 classifier_model.py 放在项目根目录或资源文件夹,
        // 实际应用中可能需要调整路径。
        // 为了演示,我们直接将Python代码作为字符串执行。
        String pythonCode =
                "class Classifier:\n" +
                "    def classify(self, i: int) -> int:\n" +
                "        print(f\"Python: Received input {i}\")\n" +
                "        return i + 1\n\n" +
                "classifier = Classifier()\n";
        interp.exec(pythonCode); // 使用exec()执行字符串形式的Python代码

        // 如果您希望从文件中加载,确保文件可访问:
        // interp.execfile("path/to/your/classifier_model.py");
        // 例如,如果文件在resources目录下,可能需要通过ClassLoader获取InputStream
        // interp.execfile(PythonIntegrationExample.class.getResourceAsStream("/classifier_model.py"));

4. 获取Python对象并调用方法

Python脚本执行后,其中定义的全局变量(如我们实例化后的classifier对象)就可以通过解释器获取到。

        // 3. 获取Python中的 'classifier' 对象
        PyObject classifierPyObject = interp.get("classifier");
        if (classifierPyObject == null) {
            System.err.println("Error: 'classifier' object not found in Python script.");
            return;
        }

        // 4. 调用 Python 对象的方法
        // invoke() 方法用于调用Python对象的方法。
        // 参数需要是 PyObject 类型,例如 PyInteger, PyString 等。
        int inputValue = 5;
        PyObject resultPyObject = classifierPyObject.invoke("classify", new PyInteger(inputValue));

        // 5. 处理返回结果
        // PyObject 可以转换为 Java 基本类型或对象
        int result = resultPyObject.asInt();
        System.out.println("Java: Classification result for " + inputValue + " is: " + result);

        // 进一步测试
        int anotherValue = 12;
        PyObject anotherResultPyObject = classifierPyObject.invoke("classify", new PyInteger(anotherValue));
        System.out.println("Java: Classification result for " + anotherValue + " is: " + anotherResultPyObject.asInt());

        // 关闭解释器(可选,但推荐在不再使用时进行)
        interp.close();
    }
}

完整代码示例

为了方便理解,我们将Java和Python代码整合在一个流程中。

classifier_model.py (保持不变):

class Classifier:
    def classify(self, i: int) -> int:
        print(f"Python: Received input {i}")
        return i + 1

classifier = Classifier()

PythonIntegrationExample.java:

import org.python.core.PyException;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class PythonIntegrationExample {

    public static void main(String[] args) throws PyException {
        // 1. 初始化Python解释器
        PythonInterpreter interp = new PythonInterpreter();

        try {
            // 2. 执行Python脚本内容
            // 最佳实践:从文件或资源加载Python脚本
            // 为了演示,这里直接使用字符串形式的Python代码
            String pythonCode =
                    "class Classifier:\n" +
                    "    def classify(self, i: int) -> int:\n" +
                    "        print(f\"Python: Received input {i}\")\n" +
                    "        return i + 1\n\n" +
                    "classifier = Classifier()\n";
            interp.exec(pythonCode);

            // 3. 获取Python中的 'classifier' 对象
            PyObject classifierPyObject = interp.get("classifier");
            if (classifierPyObject == null) {
                System.err.println("Error: 'classifier' object not found in Python script.");
                return;
            }

            // 4. 调用 Python 对象的方法
            int inputValue1 = 5;
            PyObject resultPyObject1 = classifierPyObject.invoke("classify", new PyInteger(inputValue1));
            System.out.println("Java: Classification result for " + inputValue1 + " is: " + resultPyObject1.asInt());

            int inputValue2 = 10;
            PyObject resultPyObject2 = classifierPyObject.invoke("classify", new PyInteger(inputValue2));
            System.out.println("Java: Classification result for " + inputValue2 + " is: " + resultPyObject2.asInt());

        } catch (PyException e) {
            System.err.println("A Python error occurred: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 确保解释器被关闭
            if (interp != null) {
                interp.close();
            }
        }
    }
}

运行结果示例:

Python: Received input 5
Java: Classification result for 5 is: 6
Python: Received input 10
Java: Classification result for 10 is: 11

注意事项与限制

尽管Jython提供了一种便捷的Python-Java集成方式,但在实际应用于机器学习模型时,存在一些重要的限制:

  1. C扩展库兼容性: Jython是纯Java实现的Python,它无法直接运行依赖于C语言扩展的Python库。这意味着像NumPy、SciPy、Pandas、TensorFlow、PyTorch等主流机器学习库,都无法在Jython环境中直接使用。如果您的机器学习模型严重依赖这些库,Jython将不适用。
  2. 性能: 对于计算密集型任务,Jython的性能可能不如原生Python或Java代码。
  3. Python版本支持: Jython通常会滞后于CPython(官方Python实现)的版本。目前(Jython 2.7.3)主要支持Python 2.7语法,对Python 3的支持还在发展中。
  4. 环境管理: 在Java项目中管理Python的依赖(尤其是一些纯Python库)可能不如使用pip那样方便。

适用场景: Jython更适合于以下场景:

  • 模型逻辑完全由纯Python实现,不依赖于C扩展库。
  • 需要执行一些Python脚本进行数据预处理、规则引擎或轻量级计算。
  • 希望将Python代码作为“插件”嵌入到Java应用中。

对于依赖复杂机器学习库的模型,更常见的集成方案是:

  • 构建RESTful API: 使用Flask、FastAPI等Python框架将模型部署为微服务,Java应用通过HTTP请求调用。
  • gRPC: 使用gRPC进行高性能的跨语言通信。
  • 模型序列化格式: 将模型导出为ONNX、PMML等跨平台格式,然后在Java中使用相应的推理引擎。

总结

通过Jython,开发者可以在Java应用程序中无缝地执行和调用纯Python代码,这为Python与Java的集成提供了一条直接的路径。通过本文提供的步骤和示例,您可以成功地将简单的Python逻辑(如本例中的分类器)嵌入到您的Java项目中。然而,在决定使用Jython时,务必充分考虑其在处理依赖C扩展的复杂机器学习库时的局限性,并根据实际需求选择最合适的集成方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

401

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

620

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

354

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

259

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

606

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

531

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

647

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

604

2023.09.22

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号