Java通过命令行调用外部Python脚本无法获取控制台输出如何解决?
问题根因
- 不支持shell重定向语法:你在终端执行的
python Main.py < input.txt里的<是shell(bash、cmd等终端环境)的内置功能,作用是把input.txt的内容注入到进程的标准输入。但Runtime.getRuntime().exec()是直接启动Python进程,不会经过shell解析,< input.txt会被当成参数传递给Main.py,而非输入重定向逻辑。你的Python脚本需要读取两次标准输入,却收不到任何内容,会一直处于阻塞等待状态,自然不会有输出返回。 - 流读取与进程等待顺序错误:你启动进程后立刻调用了
process.waitFor(),要等进程退出后才读输出流。如果进程的输出内容超过系统缓冲区上限,会因为缓冲区满无法继续写入输出而卡住,最终导致进程永远无法退出,形成死锁。同时代码中两次调用waitFor()属于冗余逻辑,没有必要重复执行。 - 额外注意:你没有读取进程的错误输出流,如果Python脚本执行出错抛出异常,错误信息会写入错误流,缓冲区满后也会导致进程阻塞。
修复方案
优先推荐手动处理输入流的方案,跨系统兼容性最好,不需要适配不同平台的shell:
import java.nio.file.Files; import java.nio.file.Paths; import java.io.*; // 类和方法定义省略,仅展示核心逻辑 try { // 启动Python进程,不要携带重定向符号 Process process = Runtime.getRuntime().exec("python Main.py"); // 1. 把input.txt的内容写入进程的标准输入 OutputStream processInput = process.getOutputStream(); Files.copy(Paths.get("input.txt"), processInput); processInput.flush(); processInput.close(); // 必须关闭输入流,告知Python输入已结束 // 2. 同时读取标准输出和错误输出,避免阻塞 BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); StringBuilder output = new StringBuilder(); StringBuilder errorLog = new StringBuilder(); String line; while ((line = stdoutReader.readLine()) != null) { output.append(line).append("\n"); } while ((line = stderrReader.readLine()) != null) { errorLog.append(line).append("\n"); } // 3. 所有流读取完成后再等待进程退出 int exitCode = process.waitFor(); if (exitCode == 0) { System.out.println("执行成功,输出内容:"); System.out.println(output); } else { System.out.println("执行失败,错误码:" + exitCode); System.out.println("错误信息:"); System.out.println(errorLog); } } catch (Exception e) { e.printStackTrace(); }
如果你不想手动处理输入流,也可以选择启动shell执行命令,需要根据操作系统调整命令:
- Windows 平台:把执行命令改为
Runtime.getRuntime().exec("cmd /c python Main.py < input.txt") - Linux/macOS 平台:把执行命令改为
Runtime.getRuntime().exec(new String[]{"sh", "-c", "python Main.py < input.txt"})
小提示:如果系统默认
python指向Python2,你可以把命令中的python替换为python3,或者填写Python解释器的绝对路径,避免出现找不到Python命令的问题。
内容的提问来源于stack exchange,提问作者Pranay Katariya
相关产品推荐
相关产品推荐

