JAVA 调用python.py脚本实战

本文只使用了java的Runtime.exec() 进程调用python.py脚本执行并返回

前提:如果.py文件为广大用户自主上传不建议使用,因为安全性真不高,无法检测py文件执行内容

话不多说上代码:

        java代码:

package org.mics.user.config;

import org.mics.lang.exception.CustomException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @author zy
 * @title: PythonScript  python脚本进程类
 * @projectName xxx
 * @description: TODO
 * @date 2022/4/22 0022 14:18
 * @Version 2.0
 */
@Component
public class PythonScript {

    private Logger logger = LoggerFactory.getLogger(PythonScript.class);
        //定义py文件获取地址 可以按照个人喜好,如配置在application内
    private String serverPath="/home/pythonDemo/";

    /**
     * @Titel  这里的参数可以按照需求定义
     * @param file  数据文件
     * @param fileUrl 脚本地址 
     * @return
     */
    public String fileScript(MultipartFile file,String fileUrl){

        Process proc;
        try {
            byte[] bytes = file.getBytes();
        //cmds定时数组 参数为{'python3','py脚本文件地址','参数1','参数...'}
            String[] cmds = new String[]{"python3",serverPath+fileUrl,bytes.toString()};
            proc = Runtime.getRuntime().exec(cmds);// 执行py文件
            StringBuilder builder = new StringBuilder();
            //用输入输出流来截取结果
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"GBK"));
//获取进程返回流 (返:python.py内的print("打印内容"))
            String line = null;
            while ((line = in.readLine()) != null) {
                //拼接返回
                builder.append(line);
            }
            logger.info("<-----python脚本返回流------------->"+builder.toString());
            in.close();
            int i = proc.waitFor();
            //这里子进程的状态 =0为正常执行成功,其余的为错误:  另外9009表示执行此进程无响应
             //下面有提到调试无响应
            logger.info("<-----子进程结束状态------------->"+i);
            if(i ==0){
                logger.info("<-----python脚本执行成功------------->");
            }else{
                //获取返回报错异常流
                InputStream errorStream = proc.getErrorStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream,"GBK"));
                String line1 = null;
                while ((line1 = reader.readLine()) != null) {
                    logger.info("<-----python脚本异常流------------->"+reader.readLine());
                }
                logger.info("<-----python脚本执行失败------------->");
                throw new CustomException(405,"python脚本执行失败,code:"+i);
            }
             //杀死进程
            proc.destroy();
             //返回调用结果
            return  builder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
       return null;
    }
}

python3测试代码:

      上demo.py

//下面python 文件代码

import numpy as np

a = np.arange(12).reshape(3,4)


if __name__ == '__main__':
    print(a)

python 主体代码一定是居左

类似(必须有主体)print,return 等等一律间隔一定的空格,可按(Tab)进行做间隔

//这里调试了很久,windows(删除默认版本)本地没有调试成功,可能是版本原因,本地python3版本为3.10.4,后打包到测试服的python3(服务器自带)版本为3.6.8,线上需要安装pip 命令导包,通过wget可以进行安装pip,pip安装后可以使用命令 pip install xxxx 安装python3 import 包,安装后可以使用命令 python3 test.py 来测试脚本(文件)是否执行成功

正常返回证明测试没有问题。

本文就介绍到这里,如小伙伴们有建议可以评论回复,感谢支持!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值