Java调用Python的简单运用

news2024/9/21 16:17:21

这里提供两种调用方法:

1、通过Jython来实现Java调用Python (目前只支持Python2)

2、通过ProcessBuilder来实现Java执行Python脚本(既支持Python2也支持Python3

通过Jython来实现Java调用Python 

Jython目前只支持Python2

一、准备好Python代码

下面是一个Python快排的代码:

def partition(arr, low, high):
    i = low - 1
    pivot = arr[high]
    for j in range(low, high):
        if arr[j] <= pivot:
            i = i + 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return i + 1

def quick_sort(arr, low, high):
    if low < high:
        p = partition(arr, low, high)
        quick_sort(arr, low, p - 1)
        quick_sort(arr, p + 1, high)

def do_sort(nums):
    arr=nums
    n=len(arr)
    quick_sort(arr,0,n-1)
    return arr

注意:如果加了中文记得注意中文乱码问题!!!

二、编写Springboot

1、引入依赖

这里只展示关键的依赖:Jpthon依赖

可以在这里找到相关依赖:https://mvnrepository.com/artifact/org.python/jython-standalone

        <!-- https://mvnrepository.com/artifact/org.python/jython-standalone -->
        <dependency>
            <groupId>org.python</groupId>
            <artifactId>jython-standalone</artifactId>
            <version>2.7.3</version>
        </dependency>
2、将Python代码放在指定目录

拿到他的绝对路径:

E:\\Java\\testDemo\\jython-demo\\src\\main\\java\\com\\bluefoxyu\\com\\bluefox\\py\\quick-sort.py
3、编写controller

在接口中用Java调用Python中的快排是实现排序

@RestController()
@RequestMapping("/py")
public class PyTestController {

    @GetMapping("/jython/quick-sort")
    public String PyTestQuickSort(){
        PythonInterpreter interpreter=new PythonInterpreter();
        List<Integer> list = new ArrayList<>();
        Random random=new Random();
        for (int i = 0; i < 10; i++) {
            list.add(random.nextInt(100));
        }
        //使用interpreter.execfile方法执行一个Python脚本文件
        interpreter.execfile("E:\\Java\\testDemo\\jython-demo\\src\\main\\java\\com\\bluefoxyu\\com\\bluefox\\py\\quick-sort.py");
        //通过interpreter.get方法获取do_sort函数,并将其转换为PyFunction类型
        PyFunction pyFunction = interpreter.get("do_sort", PyFunction.class);
        //调用do_sort函数,将Java中的ArrayList转换为Jython的PyList,然后作为参数传递给Python函数
        PyObject pyObject = pyFunction.__call__(new PyList(list));
        return pyObject.toString();
    }

}

注意:记得使用绝对路径,使用相对路径会报错。

4、postman中测试

测试通过!成功实现Java调用Python。

通过ProcessBuilder来实现Java执行Python脚本

支持Python2Python3

下面讲述一下原理:

Java调用Python脚本的过程本质上是通过Java程序在底层操作系统上启动一个新进程来执行Python脚本。具体过程包括以下步骤:

  • 进程启动:使用ProcessBuilder启动一个外部进程,在这个场景下是Python解释器。
  • 参数传递:将Java中生成的数据通过命令行参数的形式传递给Python脚本。
  • 捕获输出:Python脚本执行后产生的输出通过标准输出流(stdout)返回,Java程序可以读取并处理这个输出。
  • 进程终止:等待Python脚本执行完毕后,Java程序获取进程的退出状态,并关闭所有相关资源。

一、修改之前的Python代码

下面是完整代码:

import json
import sys


def partition(arr, low, high):
    i = low - 1
    pivot = arr[high]
    for j in range(low, high):
        if arr[j] <= pivot:
            i = i + 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return i + 1

def quick_sort(arr, low, high):
    if low < high:
        p = partition(arr, low, high)
        quick_sort(arr, low, p - 1)
        quick_sort(arr, p + 1, high)

def do_sort(nums):
    arr=nums
    n=len(arr)
    quick_sort(arr,0,n-1)
    return arr

if __name__ == '__main__':
    # 假设第一个命令行参数是JSON格式的列表
    if len(sys.argv) > 1:
        nums = json.loads(sys.argv[1])
        print(do_sort(nums))
    else:
        print("Usage: python quick-sort.py <json_list>")

路径是:

E:\\Java\\testDemo\\jython-demo\\src\\main\\java\\com\\bluefoxyu\\com\\bluefox\\py\\quick-sort.py

二、编写Springboot

1、引入依赖

在案例中用到将数据转换成Json格式的数据传给Python脚本,这里用到的Json转化根据是hutool工具包里面的Json里面的JSONUtil,所以这里引入依赖:

        <!--hutool工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.11</version>
        </dependency>
2、编写controller

下面给出代码,代码里面都有解释:

    @GetMapping("/io/quick-sort")
    public String PyTestIoQuickSort() {

        List<Integer> list = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            list.add(random.nextInt(100));
        }

        // 使用Hutool库的JSONUtil.toJsonStr(list)方法将ArrayList转换为JSON格式的字符串,这样就能方便地将数据传递给Python脚本。
        String jsonStr = JSONUtil.toJsonStr(list);
        System.out.println("jsonStr = " + jsonStr);

        /*BufferedReader reader :用于读取Python脚本的标准输出。
        StringBuilder result :用于存储并拼接Python脚本的输出结果。*/
        BufferedReader reader = null;

        /*ProcessBuilder processBuilder:用于构建一个新的进程,以运行Python脚本。构造函数接受命令和参数:*/
        StringBuilder result = new StringBuilder();
        try {
            ProcessBuilder processBuilder = new ProcessBuilder(
                    "python",
                    "E:\\Java\\testDemo\\jython-demo\\src\\main\\java\\com\\bluefoxyu\\com\\bluefox\\py\\quick-sort.py",
                    jsonStr);

            /* 启动进程并运行Python脚本。*/
            Process process = processBuilder.start();

            /*reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));
            从Python脚本的标准输出流中读取数据。使用GBK编码格式读取,因为可能涉及到中文输出。*/
            reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));
            String line;

            // 逐行读取Python脚本的输出,并将其追加到result中。
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }

            /*int exitCode = process.waitFor();:等待Python脚本执行完毕,并获取进程的退出状态码。
            System.out.println("Exited with error code " + exitCode);:输出Python脚本的退出状态码,0表示成功执行。
            System.out.println("Result: " + result.toString());:输出Python脚本的执行结果。*/
            int exitCode = process.waitFor();
            System.out.println("Exited with error code " + exitCode);
            System.out.println("Result: " + result.toString());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            return "Error occurred: " + e.getMessage();
        } finally {
            //在finally块中关闭BufferedReader,以确保资源被正确释放。
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        // 返回Python脚本的输出结果
        return result.toString();
    }

这里给出ProcessBuilder processBuilder里面几个参数的解释:

  • "python":表示要启动的程序是Python解释器。
  • "E:\\Java\\testDemo\\jython-demo\\src\\main\\java\\com\\bluefoxyu\\com\\bluefox\\py\\quick-sort.py":Python脚本的路径。
  • jsonStr:传递给Python脚本的参数,即JSON格式的整数列表。
3、postman中测试

IDEA中控制台输出:

说明成功实现Java调用Python!!

参考:

关于Java调用Python还可以参考一些博客:

在Java代码中使用Python_java集成python代码-CSDN博客

java调用python文件的几种方式【超细讲解!】_java_烟花苏柳-华为云开发者空间
java调用python文件的几种方式【超细讲解!】_java调用python方法-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何高效记录并整理编程学习笔记

目录 1.概述 1.1. 选择合适的工具 1.2. 分类整理 1.3. 制定标准格式 1.4. 定期复习和更新 1.5. 利用图形和视觉辅助 1.6. 记录问题和解决过程 1.7. 使用版本控制 1.8. 与他人分享和讨论 2.笔记工具选择 2.1. 印象笔记 2.2. 语雀 2.3. 有道云笔记 2.4. 腾讯文档 …

基于Spring Boot的企业员工薪酬关系系统的设计

TOC springboot229基于Spring Boot的企业员工薪酬关系系统的设计 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#…

Spring好坑!为什么代理对象的属性没有值?

先看代码&#xff1a; Service Transactional public class ZhouyuService {private String name "zhouyu";public final void test() {System.out.println(name);} }关键点&#xff1a; 加了Transactional&#xff0c;所以ZhouyuService会生成代理对象作为Bean对…

HAProxy理论+实验

目录 一、基于cookie的会话保持 1、配置选项 2、配置示例 3、验证cookie信息 二、IP透传 1、layer4 与 layer7 &#xff08;1&#xff09;四层:IPPORT转发 &#xff08;2&#xff09;七层:协议内容交换 三、haproxy的ACL应用 1、ACL配置选项 &#xff08;1&#xf…

应用案例:劳易测传感器助力宝马集团莱比锡工厂锂电池生产

位于德国萨克森州的宝马集团莱比锡工厂&#xff0c;是全球领先的汽车制造基地之一&#xff0c;不仅生产燃油车&#xff0c;也致力于电动汽车的生产。随着电动汽车及混合动力车辆的普及&#xff0c;锂电池的需求日益增长&#xff0c;宝马集团在莱比锡工厂内部设立了锂电池生产线…

Python之简单了解pylab绘图工具和汇编语言

《Python入门经典以解决计算问题为导向的Python编程实践》89-93页的笔记。 用pylab对数据绘图最小的通用计算 用pylab对数据绘图 PyLab是Matplotlib面向对象绘图库的过程界面。Matplotlib是整个软件包&#xff1b; matplotlib.pyplot是Matplotlib中的一个模块&#xff1b;而P…

能够清理浮毛的宠物空气净化器哪家好用?希喂、安德迈测评分享

虽然已经立秋了&#xff0c;但是现在这个天气还是很热&#xff0c;尤其是还处在南方城市就更加了&#xff0c;天气热空气中的水含量还高&#xff0c;这就代表着即使下雨天能降温但身体还是会有黏黏的感觉。家里养有猫和狗&#xff0c;大汗淋漓的到家&#xff0c;一进门就被我家…

17位著名妈妈和女儿在电影中合作 包括斯特里普、黛米摩尔、安吉丽娜朱莉等

好莱坞母女二人组正在占领大银幕。如今&#xff0c;你不会只在头条新闻中看到她们的名字。这些强大的女性正在联手&#xff0c;创造电影奇迹&#xff0c;并为她们家喻户晓的名字增添更多的明星影响力。 虽然像戈尔迪霍恩和凯特哈德森这样的母女组合更喜欢分开工作&#xff0c;…

Python进阶之3D图形

Python进阶之3D图形 在数据可视化中&#xff0c;2D图形通常可以满足大多数需求。然而&#xff0c;对于一些复杂的数据或分析&#xff0c;3D图形可以提供更多的视角和洞察。在Python中&#xff0c;使用 Matplotlib 和 Plotly 等库可以轻松创建各种3D图形。本文将介绍如何使用这…

C++第一讲:开篇

C第一讲&#xff1a;开篇 1.C历史背景1.1C创世主--本贾尼1.2C版本更新1.3C的重要性1.4C书籍推荐 2.C的第一个程序3.命名空间3.1namespace是什么3.2namespace的使用3.3namespace使用注意事项3.4命名空间的使用 4.C输入和输出5.缺省参数6.函数重载7.引用7.1什么是引用7.2引用的定…

点餐系统软件源码入门教程:从零开始构建你的餐饮系统

随着餐饮行业的数字化转型&#xff0c;点餐系统已经成为餐厅运营不可或缺的一部分。无论是新手开发者还是有经验的程序员&#xff0c;学习如何从零开始构建一个点餐系统&#xff0c;都是一项具有挑战性但又非常有意义的任务。本文将带你逐步了解如何使用基本的技术和代码&#…

E. Lucky Queries

https://codeforces.com/contest/145/problem/E 元素值只有4,7转换成01序列&#xff0c;操作一区间反转,操作二询问类LIS 我们先考虑操作二 应该维护什么量呢 线段树维护量&#xff0c;是通过左子树和右子树的信息合并来维护的 大致有两种情况 可以发现可以通过Leftcnt0Righ…

45.跳跃游戏

&#xff1a;双层for。复杂度n*n n class Solution {public int jump(int[] nums) {// 找到所有的条约方法&#xff0c;返回其中的最小次数// 从后向前&#xff0c;依次记录到最后的次数int n nums.length;if(n 1) return 0;// int[] temp new int[n];// temp[n-1] 0;fo…

Redis远程字典服务器(5) —— hash类型详解

目录 一&#xff0c;hash基本情况 二&#xff0c;hash常用命令详解 2.1 hset&#xff0c;hget&#xff0c;hexists&#xff0c;hdel 2.2 hexists&#xff0c;hdel 2.3 hkeys&#xff0c;hvals 2.4 hgetall&#xff0c;hmget 2.5 hlen&#xff0c;hsetnx 2.6 hincrby&am…

Android逆向题解 攻防世界难度4- Android2.0

Jeb打开apk 关键代码在Native函数getResult IDA 打开 so 发现代码比较简单&#xff0c;可以直接静态分析。 输出字符串也就是flag 长度是15&#xff0c;然后分成三段&#xff0c;第一段是可以整除3&#xff0c;第二段是除3取余1&#xff0c;第三段是除3取余等于2&#xff1…

【Redis进阶】缓存设计模式

目录 Cache Aside&#xff08;旁路缓存&#xff09;模式 概念 读操作流程如上图所示 写操作流程如上图所示 代码示例 总结 Read-Through 模式 概念 操作流程&#xff1a; 优点&#xff1a; Write-Through 模式 概念 操作流程&#xff1a; 优点&#xff1a; Writ…

【摄影后期技巧】连拍多张图像中快速找到最清晰的图像——Python代码实现

手持相机高速连拍过程&#xff0c;当快门速度不够高时不可避免出现模糊帧&#xff0c;通过肉眼去从多张连拍图像中找到最清晰的帧是比较费事的&#xff0c;可通过代码自动去计算最清晰的图像&#xff0c;省去挑选图像的麻烦事&#xff0c;同时也可以将模糊图像剔除掉&#xff0…

【Python学习-UI界面】PyQt5 小部件11-Dialog Button Box 确认与取消框

样式如下: 一个预配置的对话框&#xff0c;带有一个文本字段和两个按钮&#xff0c;OK和取消。在用户单击OK按钮或按下Enter键后&#xff0c;父窗口会在文本框中收集输入。 用户输入可以是数字、字符串或列表中的项。还会显示一个提示用户应该做什么的标签。 常用方法如下&…

详细介绍 Vue3 的 watch 和 watchEffect

在 Vue 3 中&#xff0c;watch 和 watchEffect 都是用于响应式地监听数据变化的工具&#xff0c;但它们有不同的使用场景和工作机制。 1. watch 1、概念 watch 是 Vue 3 提供的一个用于观察响应式数据变化并在数据发生变化时执行特定操作的工具。它通常用于执行副作用&#…

LeetCode 热题 HOT 100 (023/100)【宇宙最简单版】

【技巧】No. 0647 回文子串【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff…