java SpringBoot中执行python、shell脚本

本文介绍了一个项目需求,即通过REST API来执行Python和Shell脚本。示例中展示了如何在Java控制器中调用Runtime类来运行Python脚本`hello.py`和Shell脚本`hello.sh`,并提供了测试接口`/api/v1/op/shell`的调用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近项目上有一个需求需要暴露rest请求,这个rest请求要去执行python或者shell脚本;

1、目录结构

在这里插入图片描述

2、py示例

print 'hello python'

3、shell示例

echo 'hello shell'
mkdir hello

4、rest接口示例

package com.hxs.demo.soon.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.List;

/**
 * @Date 2022/8/5
 * @Author hxs
 */
@RestController
@RequestMapping(path = "/api/v1/op")
public class OptionController {
    private static final String PYNAME ="hello.py";
    private static final String SHELLNAME ="hello.sh";

    @GetMapping(path = "/python")
    public List<String> python() {
        String path = OptionController.class.getClassLoader().getResource("").getPath();
        Process proc;
        try {
            //执行脚本
            proc = Runtime.getRuntime().exec("python " + path + PYNAME);
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            proc.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

        return Collections.singletonList("success");
    }

    @GetMapping(path = "/shell")
    public List<String> shell() {
        String path = OptionController.class.getClassLoader().getResource("").getPath();
        try {
            //先授权
            ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "755", path+SHELLNAME);
            Process ps = pb.start();
            ps.waitFor();

            //执行脚本
            Process process = Runtime.getRuntime().exec(path+SHELLNAME);
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

        return Collections.singletonList("success");
    }
}

5、测试

http://localhost:8980/api/v1/op/shell
在这里插入图片描述
新增的目录
在这里插入图片描述

### 如何在 Spring Boot 项目中配置和调用 Python 脚本 #### 使用 `ProcessBuilder` 实现调用 Python 脚本 为了使 Spring Boot 应用程序能够执行外部命令并运行 Python 脚本,可以采用 Java 的 `ProcessBuilder` 类来构建进程对象。下面展示了一个简单的例子,在这个例子中,Python 文件位于指定路径下,并打印一条消息。 ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class PythonScriptRunner { public void runPythonScript() throws Exception { // 定义Python脚本的位置以及传递给它的参数 private static final String PYTHON_SCRIPT_PATH = "D:\\python\\helloWorld.py"; ProcessBuilder processBuilder = new ProcessBuilder("python", PYTHON_SCRIPT_PATH); Process process = processBuilder.start(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); // 输出Python脚本的结果到控制台 } } int exitCode = process.waitFor(); // 等待子进程完成 if (exitCode == 0) { System.out.println("Python script executed successfully."); } else { System.err.println("Failed to execute python script, error code: " + exitCode); } } } ``` 上述代码片段展示了如何利用 `ProcessBuilder` 来启动一个新的进程去执行 Python 解释器加上目标脚本文件名作为参数的方式[^1]。需要注意的是,这里假设系统的环境变量已经包含了 Python执行文件所在的目录;如果不是,则需要提供完整的 Python 解释器路径。 对于更复杂的场景,比如向 Python 脚本传入参数或者处理返回的数据流等需求,也可以通过调整 `processBuilder.command()` 和读取输入/输出流的方式来满足特定的要求。 另外一种方法是使用第三方库如 Jython 或者 Py4J 进行交互式的编程接口访问,但这通常适用于那些希望在同一 JVM 内部直接嵌入 Python 解释器的应用场合,而不是简单地作为一个独立的服务被远程调用的情况。 #### 配置 Docker 支持以便于容器化部署 当考虑将带有 Python 组件的 Spring Boot 应用程序放入生产环境中时,推荐的做法之一就是将其构建成 Docker 映像。这不仅简化了依赖管理问题,还使得应用程序更容易移植到不同的服务器上运行。为此目的,应该先准备好基础镜像,安装必要的软件包(例如 Python),并将源码复制进去之后设置入口点为启动 Spring Boot 应用所需的指令[^2]。 #### 自动化部署流程概述 针对大型企业的持续集成与交付管道建设而言,编写专门用于发布新版本应用的 shell 脚本是非常有帮助的措施。这些脚本一般会负责编译打包整个工程项目、上传制品至仓库服务端、更新现有实例上的二进制文件等一系列任务。具体来说: - **准备工作**:确保所有开发者都遵循相同的编码标准和技术栈; - **构建阶段**:运用 Maven 或 Gradle 工具链完成 jar/war 归档过程; - **测试验证**:自动触发单元测试套件以确认质量达标; - **分发机制**:借助 CI 平台推送最新版次到私有的 Nexus/Sonatype Artifactory 上面; - **上线实施**:依靠 Ansible/Puppet/Chef 等工具批量修改远端主机状态直至达到预期效果[^3]。 综上所述,无论是选择哪种技术手段实现跨语言协作,都需要充分考虑到安全性因素——特别是涉及到敏感数据传输的时候更要谨慎行事!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值