我正在尝试通过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。在其他示例中,我期望使用“流程”构建器而不是“运行时”流来工作,但是,我的实现没有什么区别。
答案 0 :(得分:0)
不要不将程序与其参数连接起来。引用Oracle ProcessBuilder docs
每个流程构建器都管理以下流程属性:命令, 表示外部程序文件为 调用及其参数(如果有)
和
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
仅使用您使用的构造函数,但将每个参数作为单独的字符串传递,否则操作系统将尝试查找一个名为您给出的整个命令行的应用程序,并且显然没有此类程序