一、准备工作
在开始之前,需要完成以下环境配置:
- 安装Python:确保系统中已安装Python(推荐Python 3.6及以上版本),并添加到系统环境变量
PATH
中(可通过python --version
验证)。 - 安装Java:确保已安装JDK 8及以上版本,配置好
JAVA_HOME
环境变量。 - 引入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.exec
的script
参数需为字符串形式的脚本内容,无法直接传入文件路径。若需执行脚本文件,可通过以下两种方式解决:
- 方式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
使用,以获得更灵活的控制。同时,需注意编码、路径和脚本引擎配置等问题,确保执行成功。