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

结尾

到这里就结束了

欢迎点赞 关注 打赏 三联

相关推荐
你这个代码我看不懂3 分钟前
Java项目OOM排查
java·开发语言
暴力求解5 分钟前
C语言---动态内存管理、柔性数组
c语言·开发语言·算法
Zong_091512 分钟前
AutoCompose - 携程自动编排【开源】
java·spring boot·开源·自动编排
先做个垃圾出来………18 分钟前
Python中使用pandas
开发语言·python·pandas
DanmF--29 分钟前
C#面向对象实践项目--贪吃蛇
开发语言·游戏·c#·游戏程序
@老蝴40 分钟前
C语言 — 动态内存管理
android·c语言·开发语言
.生产的驴1 小时前
SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入
java·分布式·后端·spring·spring cloud·信息可视化·tomcat
不爱吃山楂罐头1 小时前
第三十三天打卡复习
python·深度学习
虾球xz1 小时前
CppCon 2014 学习:C++ Memory Model Meets High-Update-Rate Data Structures
java·开发语言·c++·学习
攒了一袋星辰1 小时前
Spring @Autowired自动装配的实现机制
java·后端·spring