2015-04-05 50 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"); 
相關問題