Java Process对象无法执行给定命令

时间:2019-04-04 21:16:27

标签: java python

我正在尝试通过Java应用程序运行一段Python代码。将命令直接放入到工作目录的命令提示符中后,该命令将按预期运行。但是,我尝试将Runtime和ProcessBuilder类与Process类结合使用的尝试并未产生任何正确功能的迹象,该行为是为每次调用代码创建CSV文件。

我正在Windows 10上使用Intellij运行该程序。我已将要使用的每个目录添加到环境PATH变量中,并尝试在命令中使用完整路径,而仅尝试文件名。我能找到的唯一生命来源是,如果我包含一个.waitFor()方法,那么一个.isAlive()方法将在调用.waitFor()方法之前返回true。 我搜索了各种类似的问题,并得出结论,使用ProcessBuilder对象是最好的方法,最大的问题可能是命令结构。但是,我进行了许多次迭代,但没有发现任何东西可以将捕获的错误更改为任何有用的信息。

这是我正在运行的增强隐私的代码,我在流程生成器中完整写了该命令,因为这是我尝试的最后一次迭代。

            for (int y = 1; y < iterator; y++) {
                try {

                    String command =
                            "C:\\Users\\myName\\AppData\\Local\\Programs\\Python\\Python37\\python C:\\Users\\myName\\IdeaProjects\\projectApplication\\script.py ";
                    String pythonInputPath = " C:\\Users\\myName\\IdeaProjects\\projectApplication\\bin\\output" + y + ".wav ";
                    ProcessBuilder pb = new ProcessBuilder(command+Arrays.toString(pythonCommandString).replaceAll("\\s","")+pythonInputPath+Integer.toString(y));
                    Process p = pb.start();

                    //Process checks
                    System.out.println(p.isAlive());
                    p.waitFor();
                    System.out.println(p.isAlive());

                    //Destroying process once complete to ensure smooth iterations
                    p.destroy();

                } catch (Exception ex) {
                    System.out.println("Problems with python script execution: " + ex);
                }
            }

他们的python代码接收一个WAV文件(pythonInputPath),该文件是应用程序较早部分的产物,一个Integer[]通常包含约20个值(pythonCommandString),以及一个迭代整数(y)。

.isAlive()的第一次调用是真实的,第二次调用是false,这与预期的一样,但是该脚本通常会创建CSV,该CSV应该输出到工作导向器中存在的bin文件中,并且从Java。在其他示例中,我期望使用“流程”构建器而不是“运行时”流来工作,但是,我的实现没有什么区别。

1 个答案:

答案 0 :(得分:0)

不要将程序与其参数连接起来。引用Oracle ProcessBuilder docs

  

每个流程构建器都管理以下流程属性:命令,   表示外部程序文件为   调用及其参数(如果有)

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");

仅使用您使用的构造函数,但将每个参数作为单独的字符串传递,否则操作系统将尝试查找一个名为您给出的整个命令行的应用程序,并且显然没有此类程序