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 命令运行程序

结尾

到这里就结束了

欢迎点赞 关注 打赏 三联

相关推荐
Zonda要好好学习1 分钟前
Python入门Day5
python
VBA633738 分钟前
VBA之Word应用第三章第十一节:Document对象的事件
开发语言
hweiyu0040 分钟前
Maven 私库
java·maven
wjs20241 小时前
SOAP Header 元素
开发语言
Super Rookie1 小时前
Spring Boot 企业项目技术选型
java·spring boot·后端
写不出来就跑路1 小时前
Spring Security架构与实战全解析
java·spring·架构
电商数据girl1 小时前
有哪些常用的自动化工具可以帮助处理电商API接口返回的异常数据?【知识分享】
大数据·分布式·爬虫·python·系统架构
CoooLuckly1 小时前
numpy数据分析知识总结
python·numpy
无限远的弧光灯1 小时前
c语言学习_函数递归
c语言·开发语言·学习
趣多多代言人1 小时前
从零开始手写嵌入式实时操作系统
开发语言·arm开发·单片机·嵌入式硬件·面试·职场和发展·嵌入式