
嘻道奇闻
- 文章199742
- 阅读14625734
Java调用Python脚本的3种方法,步骤详解与代码示例
你是不是经常遇到这种情况?用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接收参数
这时候可能有人要问:??为什么我照着写却报错??? 八成是这几个坑:
- Python环境变量没配置,得在命令行直接输"python"能运行才行
- 文件路径里有中文或空格,建议改成全英文路径
- 没等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的老项目里,否则就当个备胎吧。