【问题标题】:Runtime exec command working when when run from terminal but not eclipse从终端运行但不是 Eclipse 时运行时 exec 命令工作
【发布时间】:2017-12-15 18:40:47
【问题描述】:

我正在尝试使用 tesseract 对 java 中的图像进行 OCR。我意识到有像 Tess4J 这样的包装器提供了更多的功能和东西,但我一直在努力让它正确设置。无论如何,只需使用 Runtime 运行一条单行命令就足够了,因为这只是一个个人小项目,不需要在其他计算机或任何东西上工作。

我有这个代码:

import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        System.out.println(scan("full-path-to-test-image"));
    }
    public static String scan(String imgPath) {
        String contents = "";
        String cmd = "[full-path-to-tesseract-binary] " + imgPath + " stdout";
        try { contents = execCmd(cmd); }
        catch (IOException e) { e.printStackTrace(); }
        return contents;
    }
    public static String execCmd(String cmd) throws java.io.IOException {
        java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";
    }
}

当它直接从终端编译和运行时,它可以完美运行。但是,当我在 eclipse 中打开完全相同的文件时,它会给出一个 IOException:

java.io.IOException: Cannot run program "tesseract": error=2, No such file or directory

发生了什么事?感谢您的帮助。

【问题讨论】:

  • 你会想要熟悉“当前目录”和“相对路径”的概念。这些不是 Java 概念,而是基本的文件系统概念。
  • 我不完全确定您的建议。当程序直接从终端或从 Eclipse 运行时,Tesseract 不在当前目录/工作目录中,并且在命令行上时,无论当前目录如何,该命令都有效。
  • 我可能误解了输出。我认为这意味着 tesseract 本身找不到您的文件。但我可能错了。可能是 Eclipse 运行在一个 PATH 环境变量与终端 shell 不同的环境中。
  • 我更改了 cmd 字符串以包含二进制文件的完整路径,因此 PATH 变量应该不再有任何影响,对吗?
  • 您可以尝试从终端和 IDE 打印出两次运行的环境,看看是否有什么不同

标签: java eclipse tesseract runtime.exec


【解决方案1】:

在运行配置中检查 Eclipse 中测试类的工作文件夹。我敢打赌,当你从终端运行相同的程序时,它会有所不同。

【讨论】:

  • 我将它们设置为相同,但没有运气。 Tesseract 是使用自制软件安装的,因此它不位于 java 文件所在的任何一个目录中。
  • 那么在这两种情况下,Tesseract 二进制文件都应该通过系统 PATH 变量定位?作为一个疯狂的猜测 - 重新启动你的 IDE。如果您在启动 IDE 后安装了 Tesseract,它将不会收到启动后发生的任何 PATH 更新
  • 看来这不是问题。此外,为了消除来自 PATH 变量的可能问题,我将 cmd 字符串替换为二进制文件的完整路径。
最近更新 更多