java process builder-无法运行简单程序

hyrbngr7  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(369)

我有一个叫做 darknet . 这是一个用暗黑制作的c程序。
我想管理这个公司 darknet 文件夹中的程序 Darknet 看起来是这样的:

我要跑了 darknet 使用java process builder,但在运行以下代码时没有得到响应:

  1. // Arguments
  2. String darknetNamePath = darknet.getValue().getFilePath().replace("Darknet/", "./");
  3. String configurationFlag = configuration.getValue().getFilePath().replace("Darknet/", "");
  4. String weightsFlag = weights.getValue().getFilePath().replace("Darknet/", "");
  5. String imageFlag = "data/cameraSnap.png";
  6. String thresholdFlag = "-thresh " + thresholds.getValue();
  7. // Process builder
  8. ProcessBuilder processBuilder = new ProcessBuilder();
  9. processBuilder.directory(new File("Darknet")); // We need to stand inside the folder "Darknet"
  10. String commandString = "detect " + configurationFlag + " " + weightsFlag + " " + imageFlag + " " + thresholdFlag;
  11. System.out.println("darknetNamePath = " + darknetNamePath);
  12. System.out.println("commandString = " + commandString);
  13. processBuilder.command(darknetNamePath, commandString);
  14. Process process = processBuilder.start();
  15. BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
  16. String line;
  17. while ((line = reader.readLine()) != null) {
  18. System.out.println(line);
  19. }
  20. int exitCode = process.waitFor();
  21. System.out.println("\nExited with error code : " + exitCode);

这是我的输出。为什么不适合我?

  1. darknetNamePath = ./darknet
  2. commandString = detect cfg/yolov2-tiny.cfg weights/yolov2-tiny.weights data/cameraSnap.png -thresh 0.8
  3. Exited with error code : 0

但当我打电话的时候 darknet 文件通过终端,然后它的工作。

  1. ./darknet detect cfg/yolov2-tiny.cfg weights/yolov2-tiny.weights data/cameraSnap.png -thresh 0.6

更新2:
这是我的最新消息。

  1. // Arguments
  2. String darknetNamePath = darknet.getValue().getFile().getAbsolutePath();
  3. String configurationFlag = configuration.getValue().getFilePath().replace("Darknet/", "");
  4. String weightsFlag = weights.getValue().getFilePath().replace("Darknet/", "");
  5. String imageFlag = "data/cameraSnap.png";
  6. String thresholdFlag = "-thresh " + thresholds.getValue();
  7. // Process builder
  8. ProcessBuilder processBuilder = new ProcessBuilder();
  9. processBuilder.command(darknetNamePath, "detect", configurationFlag, weightsFlag, imageFlag, thresholdFlag);
  10. Process process = processBuilder.start();
  11. if (process.getInputStream().read() == -1) {
  12. System.out.println(darknetNamePath);
  13. System.out.println("detect");
  14. System.out.println(configurationFlag);
  15. System.out.println(weightsFlag);
  16. System.out.println(imageFlag);
  17. System.out.println(thresholdFlag);
  18. System.out.printf("ERROR!");
  19. }
  20. BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
  21. String line;
  22. while ((line = reader.readLine()) != null) {
  23. System.out.println(line);
  24. }
  25. int exitCode = process.waitFor();
  26. System.out.println("\nExited with error code : " + exitCode);

输出:

  1. /home/dell/Dokument/GitHub/Vaadin-DL4J-YOLO-Camera-Mail-Reporter/Vaadin-DL4J-YOLO-Camera-Mail-Reporter/Darknet/darknet
  2. detect
  3. cfg/yolov2-tiny.cfg
  4. weights/yolov2-tiny.weights
  5. data/cameraSnap.png
  6. -thresh 0.3
  7. ERROR!
  8. Exited with error code : 0

更新3:
这样做有效:

  1. // Arguments
  2. String darkPath = darknet.getValue().getFilePath().replace("Darknet/", "./"); // We need to call ./darknet, not absolute path
  3. String configurationFlag = configuration.getValue().getFilePath().replace("Darknet/", "");
  4. String weightsFlag = weights.getValue().getFilePath().replace("Darknet/", "");
  5. String imageFlag = "data/camera.png";
  6. String thresValue = String.valueOf(thresholds.getValue());
  7. // Process builder
  8. ProcessBuilder processBuilder = new ProcessBuilder();
  9. processBuilder.directory(new File("Darknet")); // Important
  10. processBuilder.command(darkPath, "detect", configurationFlag, weightsFlag, imageFlag, "-thresh", thresValue);
  11. processBuilder.redirectErrorStream(true); // Important
  12. Process process = processBuilder.start();
  13. BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
  14. String line;
  15. while ((line = reader.readLine()) != null) {
  16. System.out.println(line);
  17. }
  18. int exitCode = process.waitFor();
  19. System.out.println("\nExited with error code : " + exitCode);
8wigbo56

8wigbo561#

您的命令必须将所有参数分解为单独的部分—包括 thresholdFlag . 最好检查可执行文件是否存在。如果没有,您应该检查它的位置或修复路径变量以确保它可以被定位:

  1. File darkpath = new File(darknetNamePath);
  2. String [] cmd = new String[] { darkpath.getAbsolutePath(), "detect", configurationFlag, weightsFlag, imageFlag, "-thresh", String.valueOf(thresholds.getValue()) };
  3. System.out.println("Path: "+darkpath+ " exists="+darkpath.exists());
  4. System.out.println("exec "+Arrays.toString(cmd));
  5. processBuilder.command(cmd);

处理stderr也是值得的,最简单的方法是在调用之前重定向stderr=>stdout processBuilder.start() ```
processBuilder.redirectErrorStream(true);

  1. 如果希望java启动可执行文件而不在绝对路径前加前缀,则它需要位于以下目录之一:

System.out.println("PATH COMPONENTS FOR JAVA LAUNCH:");
Arrays.asList(System.getenv("PATH").split(File.pathSeparator)).forEach(System.out::println);

展开查看全部
sulc1iza

sulc1iza2#

您正在使用 ProcessBuilder 走错了路。command方法将可执行文件和参数作为单独的字符串,而不是路径,然后是另一个包含实际命令及其所有参数的字符串。没有shell参与对命令进行分词,因此您可以将所有不同的参数作为一个参数传递。
我没有darknet,所以这里有一个使用unix的简单命令 echo 命令:

  1. import java.io.*;
  2. public class ProcessBuilderTest {
  3. public static void main(String[] args) throws Exception {
  4. ProcessBuilder processBuilder = new ProcessBuilder();
  5. String[] command = {"/bin/echo", "hello", "world"};
  6. processBuilder.command(command);
  7. Process process = processBuilder.start();
  8. BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
  9. String line;
  10. while ((line = reader.readLine()) != null) {
  11. System.out.println(line);
  12. }
  13. int exitCode = process.waitFor();
  14. System.out.println("Exited with error code : " + exitCode);
  15. }
  16. }

当我运行这个时,我得到:

  1. robert@saaz:~$ java ProcessBuilderTest.java
  2. hello world
  3. Exited with error code : 0

我不明白为什么你的命令没有出错。如果我给出了一个错误的命令(例如,“echo”后面的尾随空格),我会得到一个异常:

  1. Exception in thread "main" java.io.IOException: Cannot run program "/bin/echo ": error=2, No such file or directory

这可能是特定于操作系统的。或者你还有其他的 darknet 可执行文件。

展开查看全部

相关问题