1、准备工作

在D盘创建一个python脚本,脚本路径为D:\python\hello.py,脚本内容为
print(“Hello World!”)
在代码中定义python脚本
private static final String PATH = “D:\python\helloWorld.py”;

2、Spring Boot调用Python脚本的方法

方法一:使用ProcessBuilder

  ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处理实现进程的控制管理。每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程

@Test
    public void testMethod1() throws IOException, InterruptedException
    {
        final ProcessBuilder processBuilder = new ProcessBuilder("python", PATH);
        processBuilder.redirectErrorStream(true);
        final Process process = processBuilder.start();
        final BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String s = null;
        while ((s = in.readLine()) != null)
        {
            System.out.println(s);
        }

        final int exitCode = process.waitFor();
        System.out.println(exitCode == 0);
    }

方法二:使用executor

  Executor框架用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1.5开始,为了把工作单元与执行机制分离开,Executor框架诞生了,他是一个用于统一创建与运行的接口。Executor框架实现的就是线程池的功能。

pom依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-exec</artifactId>
    <version>1.3</version>
</dependency>
@Test
    public void testMethod2(){
        final String line = "python " + PATH;
        final CommandLine cmdLine = CommandLine.parse(line);
        try (final ByteArrayOutputStream baos = new ByteArrayOutputStream())
        {
            final PumpStreamHandler streamHandler = new PumpStreamHandler(baos);
            final DefaultExecutor executor = new DefaultExecutor();
            executor.setStreamHandler(streamHandler);
            final int exitCode = executor.execute(cmdLine);

            log.info("调用Python脚本的执行结果: {}.", exitCode == 0 ? "成功" : "失败");
            log.info(baos.toString().trim());
        }
        catch (final IOException e)
        {
            log.error("调用Python脚本出错", e);
        }
    }

完整代码如下,添加对应的依赖即可:

package cn.itcast;

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;
import org.junit.Test;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test1 {
    private static final String PATH = "D:\\python\\helloWorld.py";
    private static Logger log = LoggerFactory.getLogger(Test1.class);
    @Test
    public void testMethod1() throws IOException, InterruptedException
    {
        final ProcessBuilder processBuilder = new ProcessBuilder("python", PATH);
        processBuilder.redirectErrorStream(true);
        final Process process = processBuilder.start();
        final BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String s = null;
        while ((s = in.readLine()) != null)
        {
            System.out.println(s);
        }

        final int exitCode = process.waitFor();
        System.out.println(exitCode == 0);
    }

    @Test
    public void testMethod2(){
        final String line = "python " + PATH;
        final CommandLine cmdLine = CommandLine.parse(line);
        try (final ByteArrayOutputStream baos = new ByteArrayOutputStream())
        {
            final PumpStreamHandler streamHandler = new PumpStreamHandler(baos);
            final DefaultExecutor executor = new DefaultExecutor();
            executor.setStreamHandler(streamHandler);
            final int exitCode = executor.execute(cmdLine);

            log.info("调用Python脚本的执行结果: {}.", exitCode == 0 ? "成功" : "失败");
            log.info(baos.toString().trim());
        }
        catch (final IOException e)
        {
            log.error("调用Python脚本出错", e);
        }
    }

}