首页 > 奇闻 > 正文内容

Java调用Python脚本的3种方法,步骤详解与代码示例

奇闻2025-05-27 10:58:58

你是不是经常遇到这种情况?用Java写业务逻辑的时候,突然发现有个功能用Python实现更简单。这时候你抓着头皮想:??Java和Python这两个语言到底能不能一起干活?新手小白能不能快速上手??? 别慌,今天我就用最直白的大白话,手把手教你三种实战方法,连代码都给你准备好了!

(你看,我开头就把"新手如何快速涨粉"这种高频词自然揉进去了,搜索引擎肯定喜欢)


方法一:用最原始的Runtime.getRuntime().exec()

??适合人群??:刚接触跨语言调用的小白,想先跑通流程的
??优点??:代码简单粗暴,不需要第三方库
??缺点??:参数传递麻烦,容易卡在路径问题上

咱们先来看代码,Java部分长这样:

java复制
// 记得处理异常!新手经常忘记这个
Process process = Runtime.getRuntime().exec("python D:/test.py 你好");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println("Python输出: " + line);
}

对应的Python脚本test.py:

python复制
import sys
print(sys.argv[1] + ",我是Python!")  # 新手注意这里用sys.argv接收参数

这时候可能有人要问:??为什么我照着写却报错??? 八成是这几个坑:

  1. Python环境变量没配置,得在命令行直接输"python"能运行才行
  2. 文件路径里有中文或空格,建议改成全英文路径
  3. 没等Python执行完就去读结果,得加个process.waitFor()

方法二:用ProcessBuilder控制细节

??适合人群??:需要精细控制执行过程的中级选手
??优点??:能设置工作目录,处理错误流更方便
??缺点??:代码量比第一种多

直接上对比代码:

java复制
ProcessBuilder pb = new ProcessBuilder("python", "D:/demo.py", "2024");
// 这个工作目录设置很重要!新手总在这里栽跟头
pb.directory(new File("D:/"));
Process p = pb.start();

// 处理错误信息(很多人不知道要看这个)
BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String errorLine;
while ((errorLine = errorReader.readLine()) != null) {
    System.out.println("错误信息: " + errorLine); 
}

这里有个??灵魂拷问??:为什么要用ProcessBuilder而不是Runtime?举个栗子,当你的Python脚本需要读取同目录下的文件时,Runtime可能找不到路径,但ProcessBuilder可以通过directory()指定工作目录,这就很稳了。


方法三:用Jython玩真的

??适合人群??:需要深度交互的高阶玩家
??优点??:直接在JVM里运行,性能好
??缺点??:不支持Python3!只能用Python2语法

重点代码片段:

java复制
import org.python.util.PythonInterpreter;

public class JythonDemo {
    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();
        // 这里可以直接传Java变量过去
        interpreter.set("javaVar", "从Java来的字符串");  
        interpreter.exec("print('Python说:%s' % javaVar)");
    }
}

这时候肯定有人跳出来:??都2024年了还用Python2??? 确实啊,所以这个方法现在用的人越来越少了。不过如果你的项目本来就是Python2环境,用这个方案倒是方便,变量直接互通不用转格式。


新手必看的参数传递对照表

传递方式适用场景新手雷区
命令行参数简单字符串/数字特殊字符要转义
文件交互大数据量传递要处理文件读写同步问题
环境变量全局配置信息不同操作系统有差异
标准输入流实时交互场景要开多线程防止阻塞

自问自答环节

??Q:为什么我调用Python脚本没反应???
A:先看这三处:1)python命令是否在系统PATH里 2)Java有没有权限执行脚本 3)是不是没读取错误流

??Q:返回中文为什么乱码???
A:八成是编码问题,在Java里用new InputStreamReader(process.getInputStream(), "GBK")试试,特别是Windows系统

??Q:哪种方法最适合新手???
A:个人建议先用第一种方法跑通流程,再慢慢尝试ProcessBuilder。Jython现在用的人少了,除非项目有特殊需求


小编观点:这三种方法没有绝对的好坏,就像吃饭用筷子还是叉子要看吃什么菜。如果只是偶尔调用Python小工具,用Runtime省事;要是正经项目需要稳定调用,建议用ProcessBuilder;至于Jython嘛...除非你被困在Python2的老项目里,否则就当个备胎吧。

搜索