本文只使用了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 来测试脚本(文件)是否执行成功
正常返回证明测试没有问题。
本文就介绍到这里,如小伙伴们有建议可以评论回复,感谢支持!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)