2
我想从我的Java应用程序运行一个shell命令。我编了一个名为“SRILM”软件,当我从壳一切运行正常:Process Builder java.io.IOException错误= 2
ngram-count -text /home/istanbul/Desktop/snlp_hmm/model.txt -order 3 -lm hoho.lm
然而,当我从我的Java应用程序运行:
ProcessBuilder lmBuilder = new ProcessBuilder("ngram-count", "-text", modelPath, "-order", "3", "-lm", "hohom.lm");
lmBuilder.directory(new File("/home/istanbul/srilm/bin/i686-m64"));
try {
final Process lmProcess = lmBuilder.start();
InputStream is = lmProcess.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
我得到这个错误:
java.io.IOException: Cannot run program "ngram-count" (in directory "/home/istanbul/srilm/bin/i686-m64"): error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
at org.itu.hmm.AlgorithmRunner.evaluate(AlgorithmRunner.java:127)
at org.itu.hmm.ApplicationRunner.main(ApplicationRunner.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
... 7 more
任何想法?
所以,你的可执行文件的完整路径是'/家庭/伊斯坦布尔/ srilm /斌/ i686的-M64/NGRAM数/ NGRAM-count' ?我假设你应该使用'lmBuilder.directory(新文件(“/ home/istanbul/srilm/bin/i686-m64 /”));'而不是。 – Tom 2015-04-05 14:38:35
@Tom我改变了它,现在我得到错误= 2。实际上,该程序是在路径下,我可以从shell的任何目录运行它(ngram-count)。 – kamaci 2015-04-05 15:02:25
那么,你说processbuilder,你提供了一个工作目录,所以它需要一个,但'/ home/istanbul/srilm/bin/i686-m64/ngram-count'是一个文件,因此是第一个例外。你能用新的异常更新你的问题吗?哦,已经完成了,确定:)。 – Tom 2015-04-05 15:08:29