在最近的项目中,有一个需求是前端传给我一个脚本文件,然后我需要运行脚本文件后将结果进行返回,那接下来就让我们看看是怎么做的吧!
public R runScripts(Integer id) {
ScriptsInfo scriptsInfo = this.baseMapper.selectById(id);
// 将输入字符串解析为 JSONArray
JSONArray 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();
// 逐行读取脚本输出并添加到输出Builder
String 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转换为字符串并将其转换为JSONObject
output = outputBuilder.toString();
// 打印脚本输出
System.out.println("脚本输出:" + output);
// 返回输出JSONObject
return R.Success("脚本运行成功", output);
} catch (Exception e) {
// 打印异常堆栈
e.printStackTrace();
return R.Failed("后台错误,请联系管理员!");
}
}
以上代码就是一个运行python脚本文件的代码,如果你想要运行其它脚本文件,修改以上代码就行。(其它格式的脚本文件暂时还没有试过)
下面简单来看一下我的脚本我文件:
import json
import os
import sys
def 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格式,数据库里面存储的类型为以下形式:
所以需要进行转换为字符串才行,以上是我的所有代码,读者可以根据自己的需求进行修改~