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依赖
           <dependency>      
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>2.0.46</version>
            </dependency>
  3. 编写matrix_opration.py脚本
    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)
            else:
                result = div(matrixA, matrixB)
            print(json.dumps(result))
    
        except Exception as e:
            print(f"Error processing matrices: {e}", file=sys.stderr)
            sys.exit(1)
  4. 编写Java端 MatrixMultiplication.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 命令运行程序

结尾

到这里就结束了

欢迎点赞 关注 打赏 三联

阅读剩余
THE END