为了账号安全,请及时绑定邮箱和手机立即绑定

Java 进程对象无法执行给定的命令

Java 进程对象无法执行给定的命令

犯罪嫌疑人X 2022-09-22 16:35:18

我正在尝试通过Java应用程序运行一段Python代码。将命令直接放入命令提示符 cd'd 到工作目录时,将完全按预期运行。但是,我试图将运行时和 ProcessBuilder 类与 Process 类结合使用,但没有产生正确函数的迹象,即每次调用代码时都会创建一个 CSV 文件。


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


这是我一直在运行的隐私增强代码,我在流程构建器中完整地写出了命令,因为这是我尝试过的最后一次迭代。


            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),该文件是应用程序早期部分的产物,通常包含 ~20 个值 () 和单个迭代整数 (y)。Integer[]pythonCommandString


第一个调用为 true,第二个调用按预期为 false,但是脚本通常会创建一个 CSV,该 CSV 应输出到工作控制器中存在的 bin 文件,并且在从 Java 运行时无法发生。从其他示例中,我期望使用流程构建器而不是运行时流来工作,但是,我的实现没有区别。.isAlive()


查看完整描述

1 回答

?
哔哔one

TA贡献1535条经验 获得超7个赞

不要将程序与其参数连接起来。引用 Oracle 流程构建器文档

每个进程构建器管理这些进程属性:命令、表示要调用的外部程序文件及其参数(如果有)的字符串列表

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

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


查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信