2015-04-05 47 views
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 

任何想法?

+0

所以,你的可执行文件的完整路径是'/家庭/伊斯坦布尔/ srilm /斌/ i686的-M64/NGRAM数/ NGRAM-count' ?我假设你应该使用'lmBuilder.directory(新文件(“/ home/istanbul/srilm/bin/i686-m64 /”));'而不是。 – Tom 2015-04-05 14:38:35

+0

@Tom我改变了它,现在我得到错误= 2。实际上,该程序是在路径下,我可以从shell的任何目录运行它(ngram-count)。 – kamaci 2015-04-05 15:02:25

+0

那么,你说processbuilder,你提供了一个工作目录,所以它需要一个,但'/ home/istanbul/srilm/bin/i686-m64/ngram-count'是一个文件,因此是第一个例外。你能用新的异常更新你的问题吗?哦,已经完成了,确定:)。 – Tom 2015-04-05 15:08:29

回答

3

当我运行它像它的工作:

ProcessBuilder lmBuilder = new ProcessBuilder("/home/istanbul/srilm/bin/i686-m64/ngram-count", "-text", modelPath, "-order", "3", "-lm", "/home/istanbul/Desktop/snlp_hmm/j.lm"); 
相关问题