【问题标题】:Running .exe located in specific folder from java program and read its output从java程序运行位于特定文件夹中的.exe并读取其输出
【发布时间】:2021-09-14 14:39:09
【问题描述】:

我正在尝试从我编写的 java GUI 运行 Yolo 检测器。我可以像这样使用 windows cmd 启动检测器:

cd <pathToYolo> \\ In my case named :C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64
darknet.exe detetctor test <pathToAConfigFile> <pathToAnotherConfigFile> <pathToModelDef> -dont_show <pathToImage> 

我尝试了多种方法。我像这样使用 Runtime.getRuntime().exec()。

try {

            String command = "darknet.exe detector test data\\obj.data cfg\\yolov4-obj.cfg backup\\rgbmodel\\yolov4-obj_last.weights -dont_show C:\\Users\\felix\\Desktop\\yoloTestSet\\RGBTest\\IMG_2392.jpg";
            Process proc = Runtime.getRuntime().exec("cmd /c start /wait " + command, null,
                    new File("C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64"));
            
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(proc.getInputStream()));
                String line;
                while ((line = br.readLine()) != null)
                    System.out.println(line);

            proc.waitFor();
            

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我也试过了:

        ProcessBuilder pb = new ProcessBuilder(
                "cmd",
                "/C",
                "start",
                "darknet.exe",
                "detector",
                "test",
                "data\\obj.data",
                "cfg\\yolov4-obj.cfg",
                "backup\\rgbmodel\\yolov4-obj_last.weights",
                "-dont_show",
                "-ext_output",
                "C:\\Users\\felix\\Desktop\\yoloTestSet\\RGBTest\\IMG_2392.jpg"
                
                );
        
        pb.directory(new File("C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64"));
        
        try {
            Process process  = pb.start();
             InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String output = null;
                while ((output = bufferedReader.readLine()) != null) {
                    System.out.println(output);
                }
         
                //wait for the process to complete
                //process.waitFor();
         
                //close the resources
                //bufferedReader.close();
                process.destroy();
        } catch (IOException e) {
            e.printStackTrace();
        }

两者都将运行该进程并在 cmd 上打印所需的输出,然后关闭 cmd。到目前为止,这正是我想要的。我现在的问题是,如何正确读取此输出。

br.readLine() 

似乎为空。 如果我在实际命令之前留下“开始”,我可以读取输出的第一行,然后一切都卡住了,省略“cmd”会给我这个错误:

Cannot run program "darknet.exe" (in directory "C:\AI\Yolo_v4\darknet\build\darknet\x64"): CreateProcess error=2, The system cannot find the file specified

doku 对“cmd /C start”部分的实际作用有点短。 我会很感激一些关于这里的问题是什么以及如何正确地做到这一点的建议, 关于菲利克斯

【问题讨论】:

  • 需要考虑的两件事 -- 1) 您调用的进程是 cmd.exe,而不是 darknet.exe。这增加了您可能并不真正需要的额外复杂性。 2) 文档表明,当某些东西正在重定向您的输出时,getInputStream() 上会出现空响应(请参阅#1)
  • 问题是,如果不先启动 cmd.exe,我真的不知道如何运行 darknet.exe。如果我在命令的其余部分之前不使用 ``` cmd /c start ```,它将不会启动。关于输出:我可以在打开的 cmd 上看到所需的输出,那么它将被重定向到哪里?或者输出显示在 cmd 本身是重定向的事实?
  • 您是否尝试过阅读process.getErrorStream() 或设置pb.redirectError()?也许您的进程写入标准错误而不是标准输出?看起来有点可疑的是您在控制台中看到了输出。您看到的没有cmd 的错误表示找不到darknet.exe。您可以尝试传递完整路径而不是 darknet.exe 吗?
  • 感谢你死的朋友给出了正确的答案。一些输出在 ErrorStream 中,但这并没有解决所有问题,还省略了“cmd /c start”并使用完整路径来获取所有内容。这样做会引发一个内部 YOLO 错误,该错误可以在它来自的 yolo 部分中修复。我有我现在需要的东西。生病发布解决方案。再次感谢,我已经为此苦苦挣扎了一个星期。顺便说一句,它似乎只与 Runtime.exec 一起工作,而不是 processBuilder。

标签: java


【解决方案1】:

感谢 Daniel Junglas 的提示,我发现这是一个解决方案。

try {
            
            

            String command = "C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64\\darknet.exe detector test C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64\\data\\obj.data C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64\\cfg\\yolov4-obj.cfg C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64\\backup\\rgbmodel\\yolov4-obj_last.weights -dont_show -ext_output C:\\Users\\felix\\Desktop\\yoloTestSet\\RGBTest\\IMG_2392.jpg";
            Process proc = Runtime.getRuntime().exec(command, null,
                    new File("C:\\AI\\Yolo_v4\\darknet\\build\\darknet\\x64"));
            
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(proc.getErrorStream()));
            
            BufferedReader stdInput = new BufferedReader(new 
                     InputStreamReader(proc.getInputStream()));
                String line;
                while ((line = br.readLine()) != null)
                    System.out.println(line);
                
                while ((line = stdInput.readLine()) != null)
                    System.out.println(line);

            proc.waitFor();
            

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

一些所需的输出在 ErrorStream 中。此外,您需要完整路径并对 YOLO 本身进行小幅更改,因为会引发内部错误。 “cmd /c start”不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多