简体   繁体   English

如何让java getRuntime()。exec()运行带参数的命令行程序?

[英]How to get java getRuntime().exec() to run a command-line program with arguments?

I've been trying to write a java program that uses the Runtime.getRuntime().exec() method to use the command-line to run an instance of the program "tesseract". 我一直在尝试编写一个使用Runtime.getRuntime().exec()方法的java程序来使用命令行来运行程序“tesseract”的实例。

Some background, Tesseract is a free open source program that is used to perform OCR (Optical Character Recognition) on pictures. 一些背景,Tesseract是一个免费的开源程序,用于在图片上执行OCR(光学字符识别)。 It takes in a picture file and outputs a text document. 它接收图片文件并输出文本文档。 It is a command-line program that uses this command to run 它是一个使用此命令运行的命令行程序

(from within the command prompt shell) (从命令提示符shell中)

tesseract imageFilePath outFilePath [optional arguments] 

example: 例:

tesseract "C:\Program Files (x86)\Tesseract-OCR\doc\eurotext.tif" "C:\Users\Dreadnought\Documents\TestingFolder\out"

the first argument calls the tesseract program, the second is the absolute path to the image file and the last argument is the path and name of what the output file should be. 第一个参数调用tesseract程序,第二个参数是图像文件的绝对路径,最后一个参数是输出文件应该是什么的路径和名称。 Tesseract only requires the name of the output file it does not require the extension. Tesseract只需要输出文件的名称,不需要扩展名。

Working from the command prompt this works perfect. 在命令提示符下工作,这非常有效。 However, I was wanting to run this from a java program and was running into some errors. 但是,我想从java程序运行它并遇到一些错误。

I found this this code to be very helpful as a starting off point 我发现这个代码作为一个起点非常有用

public class Main
{
   public static void main(String args[])
   {
      try
      {
         Runtime rt = Runtime.getRuntime();
         String cmdString = "cmd /c dir";

         System.out.println(cmdString);
         Process pr = rt.exec(cmdString);

         BufferedReader input = new BufferedReader(new InputStreamReader(
                                                   pr.getInputStream()));

         String line = null;

         while ((line = input.readLine()) != null)
         {
            System.out.println(line);
         }

         int exitVal = pr.waitFor();
         System.out.println("Exited with error code " + exitVal);

      }
      catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }
   }
}

It prints out the result of the dir command. 它打印出dir命令的结果。 However when I modified it like so 但是,当我像这样修改它

public class Main
{
   public static void main(String args[])
   {
      try
      {
         Runtime rt = Runtime.getRuntime();
         String imageFilePath = "\"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\"";
         String outputFilePath = "\"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\"";
         String[] commands = {"cmd", "/c", "tesseract", imageFilePath, outputFilePath };

         Process pr = rt.exec(commands);

         BufferedReader input = new BufferedReader(new InputStreamReader(
               pr.getInputStream()));

         String line = null;

         while ((line = input.readLine()) != null)
         {
            System.out.println(line);
         }

         int exitVal = pr.waitFor();
         System.out.println("Exited with error code " + exitVal);
      }
      catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }
   }
}

The only thing it outputs is Exited with error code 1 . 它输出的唯一内容是Exited with error code 1 This is the expected output if the Process ended with an error. 如果进程以错误结束,则这是预期的输出。

I have even tried passing "cmd /c tesseract \\"C:\\\\Program Files (x86)\\\\Tesseract-OCR\\\\doc\\\\eurotext.tif\\" \\"C:\\\\Users\\\\Dreadnought\\\\Documents\\\\TestingFolder\\\\eurotext-example\\"" and I ended up having the same error. 我甚至试过传递"cmd /c tesseract \\"C:\\\\Program Files (x86)\\\\Tesseract-OCR\\\\doc\\\\eurotext.tif\\" \\"C:\\\\Users\\\\Dreadnought\\\\Documents\\\\TestingFolder\\\\eurotext-example\\""我最终得到了同样的错误。

According to Using Quotes within getRuntime().exec I thought problem was that I was that i had tried to escape the quotes, so that is why I passed in a String array. 根据getRuntime()。exec中的Using Quotes我认为问题是我曾试图逃避引号,所以这就是我传入String数组的原因。 But I am still getting the Exited with error code 1 . 但我仍然得到Exited with error code 1

Is it possible to execute a command-line program with the java Runtime.getRuntime().exec() command? 是否可以使用java Runtime.getRuntime().exec()命令执行命令行程序?


EDIT : The problem is still occuring 编辑 :问题仍然存在

I have tried not using "cmd /c" thinking along the same line of reasoning as Evgeniy Dorofeev and Nandkumar Tekale suggested below. 我试过不按照与Evgeniy Dorofeev和Nandkumar Tekale在下面提出的推理相同的思路使用“cmd / c”思考。 However, I get a different sort of error: 但是,我得到了一个不同的错误:

java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system cannot find the file specified
java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system  cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at Main.main(Main.java:15)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
... 4 more

Maybe this gives more information? 也许这会提供更多信息? I am really curious about what is causing this problem. 我真的很好奇是什么导致了这个问题。 Also the problem is the same whether or not I add the escaped quotations to my arguments. 无论我是否将转义引用添加到我的参数中,问题都是一样的。


EDIT 2 : On a whim I provided an absolute path to the tesseract executable and not using the cmd /c worked like a charm. 编辑2 :一时兴起,我提供了tesseract可执行文件的绝对路径,而不是使用像魅力一样工作的cmd /c I guess the question is can Runtime.getRuntime().exec() not call environment variables? 我想问题是Runtime.getRuntime().exec()不能调用环境变量吗?

well tesseract is external command so you do not need to use it with cmd . well tesseract是外部命令,因此您不需要将其与cmd一起使用。 Add tesseract to environment variables. tesseract添加到环境变量中。 Use direct command as : 使用直接命令:

String[] commands = {"tesseract", imageFilePath, outputFilePath };

Exist status 1 means Incorrect function. 存在状态1表示功能不正确。 See process exit status 查看流程退出状态

You are not capturing STDERR, so when errors occur you do not receive them from STDOUT (which you are capturing). 您没有捕获STDERR,因此当发生错误时,您不会从STDOUT(您正在捕获它)中收到它们。 Try: 尝试:

BufferedReader input = new BufferedReader(new InputStreamReader(
               pr.getErrorStream()));

Another workaround without having to recompile and deploy is using the old DOS style paths for eg C:\\Program Files would be C:\\Progra~1 . 无需重新编译和部署的另一种解决方法是使用旧的DOS样式路径,例如C:\\Program Files将是C:\\Progra~1 Of course this will be helpful only if you are reading the paths from a config file or DB and registry etc. 当然,只有在从配置文件或数据库和注册表等中读取路径时,这才有用。

另一个解决方法是提供文件的完整安装路径,如/usr/local/Cellar/tesseract/3.02.02/bin/tesseract“

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何运行从Java程序中获取命令行参数的Python程序 - How to Run a Python Program that Takes Command-Line arguments from within a Java Program java:将参数传递给Python程序的getRuntime()。exec() - java: getRuntime().exec() passing arguments to a Python program 使用Java exec的额外psql命令行参数 - Extra psql command-line arguments using Java exec 使用任何命令行参数对exec调用进行Java IOException - Java IOException on exec call with any command-line arguments 如何使用Runtime.getRuntime()。exec运行任意Java程序? - How to use Runtime.getRuntime().exec to run an arbitrary Java program? 如何通过 Runtime.getRuntime().exec() 在命令行应用程序中执行命令 - How to execute commands in a command-line application through Runtime.getRuntime().exec() 如果子进程是Java程序(带有命令行参数),如何从subprocess.check_output获取输出? - How can I get output from subprocess.check_output if the subprocess is a java program(with Command-line arguments)? NetBeans 8.1 Java-当您要运行Java文件时如何添加命令行参数 - NetBeans 8.1 Java - how to add Command-line arguments when you want to run java file 如何在从Eclipse启动的Java程序中添加命令行参数? - How to add command-line arguments to a Java program launched from Eclipse? 从 spring-boot:run 获取命令行参数 - Get command-line arguments from spring-boot:run
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM