在最近的项目中,有一个需求是前端传给我一个脚本文件,然后我需要运行脚本文件后将结果进行返回,那接下来就让我们看看是怎么做的吧!
public R runScripts(Integer id) {ScriptsInfo scriptsInfo = this.baseMapper.selectById(id);// 将输入字符串解析为 JSONArrayJSONArray jsonArray = JSON.parseArray(scriptsInfo.getInputParameter());System.out.println("解析后的JSONArray为:" + jsonArray);// 如果确保只有一个元素,可以直接获取第一个元素JSONObject jsonObject = jsonArray.getJSONObject(0);System.out.println("第一个元素为:" + jsonObject);// 将JSONObject转换为字符串输出String outputs = jsonObject.toJSONString();
// String filepath= "https://yinan-bucket.oss-cn-beijing.aliyuncs.com/files/Hello1.py?Expires=1712381427&OSSAccessKeyId=TMP.3KiwQofCa6n572gJxSsgLMwqMzBpLYEpncSHgebimzpQfpmRHJDJM8yZnGjahbKATkgVtutbJqhAXuexpGu6nyESmKwMJP&Signature=cXn2noUAdoQk3niW7GhaP9pCQF8%3D";String filepath="E:/test/Hello1.py";// 初始化一个空的JSONObject作为输出String output = "";try {// 定义运行Python脚本的命令ProcessBuilder processBuilder = new ProcessBuilder("python",filepath);// 设置环境变量,传递参数给 Python 脚本processBuilder.environment().put("PARAMS",outputs);
// String[] processBuilder = new String[]{"python",filepath, "{\"name\": \"John\", \"age\": 30,\"gender\":\"女\"}"};// 将错误流重定向到控制台
// processBuilder.redirectErrorStream(true);// 启动进程Process process = processBuilder.start();
// Process proc=Runtime.getRuntime().exec(processBuilder);// 从脚本中读取输出BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));StringBuilder outputBuilder = new StringBuilder();// 逐行读取脚本输出并添加到输出BuilderString line;while ((line = reader.readLine()) != null) {System.out.println("kdnfak"+line);outputBuilder.append(line).append("\n");System.out.println("输出:" + outputBuilder);}// 等待脚本完成并获取退出代码int exitCode = process.waitFor();System.out.println("脚本执行成功,退出代码为:" + exitCode);// 将输出Builder转换为字符串并将其转换为JSONObjectoutput = outputBuilder.toString();// 打印脚本输出System.out.println("脚本输出:" + output);// 返回输出JSONObjectreturn R.Success("脚本运行成功", output);} catch (Exception e) {// 打印异常堆栈e.printStackTrace();return R.Failed("后台错误,请联系管理员!");}}
以上代码就是一个运行python脚本文件的代码,如果你想要运行其它脚本文件,修改以上代码就行。(其它格式的脚本文件暂时还没有试过)
下面简单来看一下我的脚本我文件:
import json
import os
import sysdef say_hello(data):name = data.get("name", "Unknown")age = data.get("age", 0)gender = data.get("gender", "男")output_data = {"NAME": name,"AGE": age + 10,"GENDER": gender}return json.dumps(output_data)if __name__ == "__main__":# 从环境变量中获取传入的 JSON 字符串input_json = os.environ.get("PARAMS", "{}")# 解析 JSON 字符串为 Python 字典input_data = json.loads(input_json)# 调用函数并输出结果output_json = say_hello(input_data)print(output_json)
需要注意的为以上图片标出,ScriptsInfo为我自定义的实体类,包括了脚本的一些基本信息,就包括脚本的名字,输入参数,路径等等,读者可以根据自己的程序自定义这个实体类。
如果读者跟我一样是将脚本文件先上传到oss上面,请注意一定要将这个文件下载到本地后使用本地的路径再执行这个代码,因为就跟我图片里面提示说的,ProcessBuilder这行代码会自动给你的文件路径加上项目路径,以至于找不到脚本文件的路径,导致错误。
我传入的参数为json格式,数据库里面存储的类型为以下形式:
所以需要进行转换为字符串才行,以上是我的所有代码,读者可以根据自己的需求进行修改~