java实现运行脚本文件

文章讲述了如何在Java中操作前端提交的Python脚本,包括解析参数、执行脚本、处理输出,以及注意事项,如处理来自OSS的文件路径问题。
摘要由CSDN通过智能技术生成

在最近的项目中,有一个需求是前端传给我一个脚本文件,然后我需要运行脚本文件后将结果进行返回,那接下来就让我们看看是怎么做的吧!

    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格式,数据库里面存储的类型为以下形式:

所以需要进行转换为字符串才行,以上是我的所有代码,读者可以根据自己的需求进行修改~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银氨溶液

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值