Java程序命令行调用Python矩阵算法

前言

  1. 首先我们来了解一下什么是矩阵 也就是我们常说的二维数组 矩阵运算也就是我们常说的加减乘除
  2. 如何实现java调用xxx.py

方式

  1. 使用Jython 注意:目前支持到Python 2.7 ,并不完全支持所有的Python标准库和第三方库,特别是依赖于C扩展的库
  2. 网络通讯如http python(Flask)提供http接口 Java通过 http请求调用
  3. 命令行 java通过ProcessBuilder或者Runtime.getRuntime.exec()这个类进行调用python脚本
  4. 使用Py4J网关
  5. 消息队列 Java程序发布消息 Python订阅消息并进行矩阵运算
  6. RPC

技术

  1. Java
  2. Python
  3. fastjson2

详细案例

  1. 创建一个maven项目

  2. 添加fastjson2依赖

    XML 复制代码
           <dependency>      
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>2.0.46</version>
            </dependency>
  3. 编写matrix_opration.py脚本

    python 复制代码
    import sys
    import json
    from turtledemo.paint import switchupdown
    
    import numpy as np
    
    # 加
    def add(matrixA, matrixB):
        return np.add(matrixA,matrixB).tolist()
    # 减
    def sub(matrixA, matrixB):
        return np.subtract(matrixA,matrixB).tolist()
    # 乘
    def mul(matrixA, matrixB):
        return np.dot(matrixA,matrixB).tolist()
    # 除
    def div(matrixA, matrixB):
        return np.divide(matrixA,matrixB).tolist()
    
    if __name__ == '__main__':
        if len(sys.argv) != 4:
            print('usage: python matrix_opration.py <matrixA> <matrixB>')
            sys.exit(1)
        jsonA = sys.argv[1]
        jsonB = sys.argv[2]
        # 控制使用哪个算法
        num = int(sys.argv[3])
        try:
            matrixA = np.array(json.loads(jsonA))
            matrixB = np.array(json.loads(jsonB))
            if num == 0:
                result = add(matrixA, matrixB)
            elif num == 1:
                result = sub(matrixA, matrixB)
            elif num == 2:
                result = mul(matrixA, matrixB)
            elif num == 3:
                result = div(matrixA, matrixB)
            else:
                print('invalid number')
                sys.exit(1)
            print(json.dumps(result))
    
        except Exception as e:
            print(f"Error processing matrices: {e}", file=sys.stderr)
            sys.exit(1)
  4. 编写Java端 MatrixMultiplication.java

    java 复制代码
    package com.demo;
    
    import com.alibaba.fastjson2.JSON;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.Scanner;
    
    /**
     * @Program: Default (Template) Project
     * @ClassName MatrixMultiplication
     * @Author: liutao
     * @Description: 矩阵运算客户端
     * @Create: 2025-01-02 21:09
     * @Version 1.0
     **/
    public class MatrixMultiplication {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            // 定义矩阵
            int[][] matrixA = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
            int[][] matrixB = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};
    
            String jsonMatrixA = JSON.toJSONString(matrixA);
            String jsonMatrixB = JSON.toJSONString(matrixB);
            System.out.println("请输入py文件path:");
            String pyScriptPath = sc.next();
            System.out.println("请选择矩阵算法:(0:加、1:减、2:乘、3:除)");
            String algorithm = sc.next();
            // 构建命令行调用py文件
            ProcessBuilder processBuilder = new ProcessBuilder("python",pyScriptPath,jsonMatrixA,jsonMatrixB,algorithm);
            processBuilder.redirectErrorStream(true);
    
            try{
                Process process = processBuilder.start();
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                StringBuilder output = new StringBuilder();
                String line;
                while ((line = reader.readLine())!= null) {
                    output.append(line).append("\n");
                }
                int exitCode = process.waitFor();
                System.out.println("Exited code " + exitCode);
                if(exitCode == 0){
                    int[][] result = JSON.parseObject(output.toString().trim(),int[][].class);
                    System.out.println("Matrix result:");
                    for (int[] row:result) {
                        System.out.println(Arrays.toString(row));
                    }
                    System.out.println("Python 脚本执行成功");
                } else {
                    System.err.println("Python 脚本执行失败");
                    System.out.println("output:"+output);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

测试

1、在idea配置环境变量

2、调用程序 实现运算

3、打包程序并通过java -jar xxx.jar 命令运行程序

结尾

到这里就结束了

欢迎点赞 关注 打赏 三联

相关推荐
Groundwork Explorer3 分钟前
W5500 网卡编程初始化与使用指南
python·单片机
王大大的刀3 分钟前
Spring AI 重试引起的 LLM 重复调用
java·人工智能
oh,huoyuyan9 分钟前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年26 分钟前
hutool
java·服务器·开发语言
逸Y 仙X33 分钟前
MCP(模型控制协议)完全指南:从核心概念到实战开发
python·大模型·llm·ai编程·mcp
H_oRIZoN_36 分钟前
Linux入门DAY27(文件IO(系统调用)详解|open/read/write/lseek)
java·linux·服务器
延凡科技39 分钟前
从 “人管机器“ 到 “数据管人“:智慧矿山综合管控落地实践
java·后端·struts
一木 之林1 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao1 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang
卓怡学长1 小时前
w180springboot基于Java的悠扬乐器管理
java·spring boot·mysql·spring·maven·intellij-idea