在 Spring Boot 中调用 Python 脚本或工程,主要有以下几种方式:
1. 使用 ProcessBuilder
或 Runtime
执行 Python 脚本
这是最直接的方法,使用 Java 的 ProcessBuilder
或 Runtime.getRuntime().exec()
来执行 Python 脚本。
- 优点:实现简单,无需额外依赖。
- 缺点:处理输出和错误流可能较为繁琐,性能上不如直接在 JVM 内运行。
package com.oncloudsoft.zbznhc.ajpc.service;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
@Service
public class PythonScriptService {
public String runPythonScript(String propertyJson) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("python", "/home/sunyuhua/workspace/shbgit/zb-znhc/src/main/resources/python/identify_property.py", propertyJson);
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
StringBuilder output = new StringBuilder();
while ((line = reader.readLine()) != null) {
output.append(line);
}
int exitCode = process.waitFor();
if (exitCode != 0) {
// 处理非零退出代码
return "Error executing script";
}
return output.toString();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
return "Error: " + e.getMessage();
}
}
}
2. Jython
Jython 是一个 Python 的 Java 实现,可以让你直接在 Java 虚拟机上运行 Python 代码。
- 优点:可以直接在 Java 代码中运行 Python 脚本,无需创建额外的进程。
- 缺点:Jython 只支持 Python 2.x,且不支持所有 Python 库。
3. 使用 Web 服务
将 Python 脚本或应用封装为一个 Web 服务,然后通过 HTTP 请求进行交互。
- 优点:解耦合,Python 和 Java 应用可以独立部署和扩展。
- 缺点:需要处理 HTTP 请求和响应,增加了网络通信的开销。
4. 使用消息队列
通过消息队列(如 RabbitMQ、Kafka)在 Java 和 Python 之间进行异步通信。
- 优点:支持高并发,解耦合。
- 缺点:增加了系统复杂性,需要维护消息队列。
5. 使用 gRPC 或 Thrift
使用 gRPC 或 Apache Thrift 进行跨语言的 RPC(远程过程调用)。
- 优点:强类型,高效,适用于复杂的交互。
- 缺点:需要定义和维护接口规范,实现相对复杂。
选择合适的方法
选择哪种方法取决于你的具体需求。对于简单的任务,直接使用 ProcessBuilder
或 Runtime
可能就足够了。如果你的 Python 代码和 Java 代码需要频繁和紧密地交互,可能需要考虑 Jython(如果 Python 代码兼容 Python 2.x),或者实现一个 Web 服务。如果你的应用需要高并发处理能力,消息队列或 gRPC/Thrift 可能是更好的选择。