Java Maven项目调用含pytesseract的Python脚本提示Tesseract不存在怎么解决
问题根因
报错核心为pytesseract无法找到底层tesseract可执行文件,触发原因是Java启动的Python子进程PATH环境变量与终端运行环境不一致:终端运行时PATH已配置tesseract安装目录,Maven启动的Java进程继承的系统PATH未包含该路径,因此调用时触发文件不存在错误。
修复方案
方案1:Python脚本直接指定tesseract路径(最稳定,不受运行环境影响)
首先在终端执行命令which tesseract获取tesseract可执行文件的绝对路径,示例输出为/usr/local/bin/tesseract。
然后在Python脚本中导入pytesseract后添加一行配置:import pytesseract # 替换为你实际查询到的tesseract绝对路径 pytesseract.pytesseract.tesseract_cmd = '/usr/local/bin/tesseract'方案2:Java代码中手动补充子进程的PATH变量
先通过which tesseract拿到tesseract所在的父目录(比如路径/usr/local/bin/tesseract对应的父目录为/usr/local/bin),在调用pb.start()前添加环境变量配置:String path = "/Users/team/Desktop/my.py"; ProcessBuilder pb = new ProcessBuilder("python3","/Users/team/Desktop/my.py"); // 新增环境变量配置 Map<String, String> env = pb.environment(); String originalPath = env.get("PATH"); // 把tesseract的父目录加到PATH最前面,替换为你实际查询到的目录 env.put("PATH", "/usr/local/bin:" + originalPath); Process p = pb.start(); p.waitFor(); BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = ""; while ((line = bfr.readLine()) != null) { System.out.println(line); }注:原代码中的
inheritIO()方法会把子进程的输出直接重定向到父进程控制台,和后续手动读取输入流的逻辑冲突,二选一即可,不影响当前报错的修复。方案3:本地开发临时适配
如果是在IDE中运行Maven项目,可以直接在IDE的运行配置界面找到环境变量设置项,把tesseract的安装目录追加到PATH变量中即可。该方案仅适用于本地调试,打包部署时建议选择前两种方案。
验证方法
可在Python脚本开头添加以下代码,分别在终端和Java调用时运行,对比两次输出的PATH差异,即可确认缺失的路径:
import os print("当前PATH:", os.environ.get("PATH"))
内容的提问来源于stack exchange,提问作者Ananth Kamath

