runtime.getruntime.exec 无法识别可执行文件
runtime.getruntime.exec does not recognize executable file
我正在为 运行 'optimathsat.exe' 文件使用 Runtime.getRuntime().exec() 方法。我的代码就像
public boolean runOptimathSat() throws InterruptedException {
boolean runSucceed = false;
smtInputFileDirectory = getInputDirectory();
txtOutputFileDirectory = getOutputDirectory();
optimathsatDirectory = getOptimathSatDirectory();
if ((smtInputFileDirectory != null) && (txtOutputFileDirectory != null)
&& (optimathsatDirectory != null)) {
if (isWindows()) {
String winCommand;
winCommand = "cmd /c cd " + optimathsatDirectory + " && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < " + smtInputFileDirectory + " > " + txtOutputFileDirectory + " 2>& 1";
System.err.println("COMMAND: "+winCommand);
try {
Process p = Runtime.getRuntime().exec(winCommand);
p.waitFor();
runSucceed = true;
} catch (IOException e) {
e.printStackTrace();
}
return runSucceed;}
在 运行 这段代码之后,它在控制台中显示以下行
COMMAND: cmd /c cd "C:\Users\Karencom\OptiMathSAT\optimathsat-1.5.1-windows-64-bit-mingw\bin" && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < "C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/bibi.smt2" > "C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/bibi.txt" 2>& 1
并在 bibi.txt 文件中显示以下错误
'optimathsat.exe' is not recognized as an internal or external command, operable program or batch file.
然而,当我在一个单独的项目(只有一个 class)中复制上面的一些代码行,并替换 winCommand 变量中生成的命令时,它工作得很好。
import java.io.IOException;
public class Test {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
try {
String winCommand="cmd /c cd"+ " \"C:\Users\Karencom\OptiMathSAT\optimathsat-1.5.1-windows-64-bit-mingw\bin\" && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < \"C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/sensen.smt2\" > \"C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/sensen.txt\" 2>& 1";
Process p = Runtime.getRuntime().exec(winCommand);
p.waitFor();
System.err.println("COMMAND: "+winCommand);
} catch (IOException e) {
e.printStackTrace();
}
}
}
估计是第一个项目配置不对,不知道怎么解决
您正在使用 cmd
做两件事:
- 设置当前目录
- 重定向输入和输出
与其使用 cmd
,不如使用 Java 的 ProcessBuilder
。
String[] winCommand = {
"optimathsat.exe",
"-opt.print_objectives=True",
"-opt.output_format=old",
"-optimization.card_constr_encoding=2",
"-optimization.dpll.search_strategy=1",
"-preprocessor.toplevel_propagation=False",
"-preprocessor.simplification=0"
};
Process p = new ProcessBuilder(winCommand)
.directory(new File(optimathsatDirectory)) // "cd " + optimathsatDirectory
.redirectInput(new File(smtInputFileDirectory)) // "< " + smtInputFileDirectory
.redirectOutput(new File(txtOutputFileDirectory)) // "> " + txtOutputFileDirectory
.redirectErrorStream(true) // 2>& 1
.start();
p.waitFor();
我正在为 运行 'optimathsat.exe' 文件使用 Runtime.getRuntime().exec() 方法。我的代码就像
public boolean runOptimathSat() throws InterruptedException {
boolean runSucceed = false;
smtInputFileDirectory = getInputDirectory();
txtOutputFileDirectory = getOutputDirectory();
optimathsatDirectory = getOptimathSatDirectory();
if ((smtInputFileDirectory != null) && (txtOutputFileDirectory != null)
&& (optimathsatDirectory != null)) {
if (isWindows()) {
String winCommand;
winCommand = "cmd /c cd " + optimathsatDirectory + " && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < " + smtInputFileDirectory + " > " + txtOutputFileDirectory + " 2>& 1";
System.err.println("COMMAND: "+winCommand);
try {
Process p = Runtime.getRuntime().exec(winCommand);
p.waitFor();
runSucceed = true;
} catch (IOException e) {
e.printStackTrace();
}
return runSucceed;}
在 运行 这段代码之后,它在控制台中显示以下行
COMMAND: cmd /c cd "C:\Users\Karencom\OptiMathSAT\optimathsat-1.5.1-windows-64-bit-mingw\bin" && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < "C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/bibi.smt2" > "C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/bibi.txt" 2>& 1
并在 bibi.txt 文件中显示以下错误
'optimathsat.exe' is not recognized as an internal or external command, operable program or batch file.
然而,当我在一个单独的项目(只有一个 class)中复制上面的一些代码行,并替换 winCommand 变量中生成的命令时,它工作得很好。
import java.io.IOException;
public class Test {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
try {
String winCommand="cmd /c cd"+ " \"C:\Users\Karencom\OptiMathSAT\optimathsat-1.5.1-windows-64-bit-mingw\bin\" && optimathsat.exe -opt.print_objectives=True -opt.output_format=old -optimization.card_constr_encoding=2 -optimization.dpll.search_strategy=1 -preprocessor.toplevel_propagation=False -preprocessor.simplification=0 < \"C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/sensen.smt2\" > \"C:/Users/Karencom/runtime-New_configuration/tetest/Optimathsat/sensen.txt\" 2>& 1";
Process p = Runtime.getRuntime().exec(winCommand);
p.waitFor();
System.err.println("COMMAND: "+winCommand);
} catch (IOException e) {
e.printStackTrace();
}
}
}
估计是第一个项目配置不对,不知道怎么解决
您正在使用 cmd
做两件事:
- 设置当前目录
- 重定向输入和输出
与其使用 cmd
,不如使用 Java 的 ProcessBuilder
。
String[] winCommand = {
"optimathsat.exe",
"-opt.print_objectives=True",
"-opt.output_format=old",
"-optimization.card_constr_encoding=2",
"-optimization.dpll.search_strategy=1",
"-preprocessor.toplevel_propagation=False",
"-preprocessor.simplification=0"
};
Process p = new ProcessBuilder(winCommand)
.directory(new File(optimathsatDirectory)) // "cd " + optimathsatDirectory
.redirectInput(new File(smtInputFileDirectory)) // "< " + smtInputFileDirectory
.redirectOutput(new File(txtOutputFileDirectory)) // "> " + txtOutputFileDirectory
.redirectErrorStream(true) // 2>& 1
.start();
p.waitFor();