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

结尾

到这里就结束了

欢迎点赞 关注 打赏 三联

相关推荐
AI人工智能+电脑小能手6 分钟前
【大白话说Java面试题 第169题】【07_Redis篇】第5题:如何保证缓存一致性?
java·redis·延迟双删·缓存一致性·双写一致性
Geek-Chow14 分钟前
Mobile App Certificate Pinning: Underlying Principle and a Swift Example
开发语言·ios·swift·安全架构
SimonKing18 分钟前
Spring I18N 底层源码大揭秘:你的 MessageSource 到底是怎么找到配置的?
java·后端·程序员
码云骑士18 分钟前
61-LangChain-vs-LlamaIndex-选型对比-功能矩阵-混用实践
python·线性代数·矩阵·langchain
阿豪只会阿巴23 分钟前
两小时快速入门 FastAPI--第一回
开发语言·python·fastapi
极客先躯28 分钟前
高级java每日一道面试题-2026年04月04日-实战篇[Docker]-如何排查容器存储挂载失败的问题?
java·运维·docker·容器·高级面试
Hesionberger32 分钟前
动态规划与二分法破解最长递增子序列
java·数据结构·python·算法·leetcode
JustNow_Man35 分钟前
【Claude Code】 中给 Python + XML 项目建立可靠验证体系
xml·linux·python
你怎么知道我是队长38 分钟前
JavaScript 事件介绍
开发语言·前端·javascript
薛定猫AI42 分钟前
【技术干货】多模型AI编程代理实战:用Python统一接入Claude Opus 4.8
人工智能·python·ai编程