Java运行Python脚本教程

一、准备工作

在开始之前,需要完成以下环境配置:

  1. ​安装Python​​:确保系统中已安装Python(推荐Python 3.6及以上版本),并添加到系统环境变量PATH中(可通过python --version验证)。
  2. ​安装Java​​:确保已安装JDK 8及以上版本,配置好JAVA_HOME环境变量。
  3. ​引入Hutool依赖​​:在Java项目中添加Hutool工具包依赖(以Maven为例,在pom.xml中添加):
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>最新版</version> <!-- 使用最新稳定版本 -->
    </dependency>

二、Hutool执行Python脚本的核心工具

Hutool的ScriptUtil类提供了exec方法,可用于执行指定引擎的脚本(包括Python)。其核心方法签名如下:

public static Object exec(String script, String engineName) throws ScriptException;
  • script:要执行的Python脚本内容(字符串形式);
  • engineName:脚本引擎名称,Python对应的引擎名为"python"(需确保系统已安装Python且配置正确)。

三、基础示例:执行简单Python脚本

以下代码演示如何通过Hutool执行一个简单的Python脚本(打印“Hello from Python!”):

import cn.hutool.script.ScriptUtil;

public class HutoolRunPythonDemo {
    public static void main(String[] args) {
        try {
            // 定义Python脚本内容(字符串形式)
            String pythonScript = "print('Hello from Python!')";
            
            // 执行Python脚本(指定引擎为"python")
            Object result = ScriptUtil.exec(pythonScript, "python");
            
            // 输出执行结果(此处为null,因为脚本无返回值)
            System.out.println("脚本执行结果:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

​输出结果​​:

Hello from Python!
脚本执行结果:null

四、进阶示例:执行带参数的Python脚本

若需要向Python脚本传递参数(如从Java传入变量),可通过sys.argv在Python中接收参数。以下是完整示例:

1. 编写Python脚本(test.py

将以下代码保存为src/main/resources/py/test.py(路径可根据实际情况调整):

# encoding: utf-8
import sys

# 获取Python脚本参数(sys.argv[0]是脚本名,sys.argv[1:]是传入的参数)
args = sys.argv[1:]
print("Python脚本接收到的参数:", args)

# 模拟业务处理(如计算两个数的和)
if len(args) >= 2:
    num1 = float(args[0])
    num2 = float(args[1])
    result = num1 + num2
    print(f"计算结果:{num1} + {num2} = {result}")
else:
    print("未传入足够的参数!")

2. Java代码:调用带参数的Python脚本

import cn.hutool.script.ScriptUtil;
import java.util.Arrays;

public class HutoolRunPythonWithArgsDemo {
    public static void main(String[] args) {
        try {
            // 定义Python脚本路径(需替换为实际路径)
            String scriptPath = "src/main/resources/py/test.py";
            
            // 构造执行命令(通过" -c"参数执行字符串形式的脚本,或直接指定脚本路径)
            // 注意:Hutool的ScriptUtil.exec方法不支持直接传入文件路径,需将脚本内容读取为字符串
            String scriptContent = new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get(scriptPath)));
            
            // 定义要传递的参数(如两个数字)
            String param1 = "10";
            String param2 = "20";
            String[] params = {param1, param2};
            
            // 将参数拼接到脚本内容中(通过sys.argv接收)
            String finalScript = scriptContent;
            
            // 执行Python脚本(指定引擎为"python")
            Object result = ScriptUtil.exec(finalScript, "python");
            
            // 输出执行结果(脚本中的print内容会通过标准输出返回)
            System.out.println("脚本执行完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

​输出结果​​:

Python脚本接收到的参数:['10', '20']
计算结果:10.0 + 20.0 = 30.0
脚本执行完成!

​注意​​:上述代码将Python脚本内容读取为字符串并传递给ScriptUtil.exec。若需直接执行脚本文件,可通过ProcessBuilder启动Python进程(见下文“五、常见问题解决”)。

五、常见问题解决

1. 脚本文件路径问题

ScriptUtil.execscript参数需为字符串形式的脚本内容,无法直接传入文件路径。若需执行脚本文件,可通过以下两种方式解决:

  • ​方式1​​:将脚本内容读取为字符串(如上文示例);
  • ​方式2​​:使用ProcessBuilder启动Python进程(更灵活,支持文件路径和复杂参数):
    import cn.hutool.core.io.FileUtil;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    
    public class ProcessBuilderExample {
        public static void main(String[] args) {
            try {
                // 定义Python脚本路径和参数
                String scriptPath = "src/main/resources/py/test.py";
                String[] params = {"10", "20"};
                
                // 构造ProcessBuilder命令(包含Python解释器和脚本路径)
                ProcessBuilder pb = new ProcessBuilder("python", scriptPath);
                pb.command().addAll(Arrays.asList(params));
                
                // 启动进程并获取输出
                Process process = pb.start();
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
                
                // 等待进程结束并获取退出码
                int exitCode = process.waitFor();
                System.out.println("Python脚本退出码:" + exitCode);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

2. 中文乱码问题

若Python脚本或输出包含中文,需确保Java和Python的编码一致(推荐使用UTF-8):

  • 在Python脚本开头添加# encoding: utf-8
  • 在Java中读取脚本内容时指定编码:
    String scriptContent = new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get(scriptPath)), "UTF-8");
  • 在Windows系统中,通过ProcessBuilder启动进程时设置编码:
    ProcessBuilder pb = new ProcessBuilder("python", scriptPath);
    pb.redirectErrorStream(true); // 合并标准错误流和标准输出流
    Process process = pb.start();
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); // Windows默认编码为GBK

3. 脚本引擎未找到问题

若执行时报错ScriptEngineManager无法找到python引擎,需安装Python并配置环境变量:

  • 确保Python已添加到系统PATH中(可通过python --version验证);
  • 若使用Python 3,可能需要将引擎名改为"python3"(取决于系统配置)。

六、总结

通过Hutool的ScriptUtil类,可以方便地在Java中执行Python脚本(尤其是简单的字符串脚本)。若需要执行脚本文件或传递复杂参数,建议结合ProcessBuilder使用,以获得更灵活的控制。同时,需注意编码、路径和脚本引擎配置等问题,确保执行成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值