2015-02-08 72 views
-1

我試圖運行Java中由c生成的可執行文件。本來,我可以Java Runtime.getRuntime()。exec用參數運行「c可執行文件」

./bin/svm-train -s 0 -t 0 -d 3 -g 0.0 -r 0.0 -n 0.5 -m 40.0 -c 1.0 -e 0.001 -p 0.1 ./data/trainfile ./model/update.model 

終端上運行它在終端這個命令的效果很好,這將需要幾秒鐘的代碼表示生成一個文件「update.model」。

但是當我嘗試把這個過程在Java中使用下面的代碼,程序不會產生「update.model」

String[] cmdUpdateTrain = new String[]{"/bin/bash", "-c", "./bin/svm-train -s 0 -t 0 -d 3 -g 0.0 -r 0.0 -n 0.5 -m 40.0 -c 1.0 -e 0.001 -p 0.1 ./data/trainfile ./model/update.model"}; 
Runtime.getRuntime().exec(cmdUpdateTrain); 

如果我嘗試使用Java以下代碼結束,它工作正常的模型也可以生成。

String[] cmdUpdateTrain = new String[]{"/bin/bash", "-c", "./bin/svm-train ./data/trainfile ./model/update.model"}; 
Runtime.getRuntime().exec(cmdUpdateTrain); 

所以我認爲這可能是處理參數./bin/svm-train的問題。


我找到了它發生的原因。這是因爲程序在執行./bin/svm-train停止之前結束。 而下面的代碼解決了這個問題。

try{ 
    String[] cmdUpdateTrain = new String[]{"/bin/bash", "-c", "./bin/svm-train -s 0 -t 0 -d 3 -g 0.0 -r 0.0 -n 0.5 -m 40.0 -c 1.0 -e 0.001 -p 0.1 ./data/trainfile ./model/update.model"}; 
    Process psTrain = Runtime.getRuntime().exec(cmdUpdateTrain); 
    psTrain.waitFor(); 
}catch(InterruptedException interupt){ 
} 
+1

你說這是行不通的。當你嘗試運行它會發生什麼?你有沒有收到任何錯誤信息?請修改您的問題以包含此信息。 – Kenster 2015-02-08 13:05:51

回答

0

調用Runtime.getRuntime()。EXEC(cmdUpdateTrain)

不要。使用。的Runtime.exec()。

您的命令行有幾個問題。

首先:您是否注意到您的命令的開始以及您的兩個文件參數的路徑?它們與您啓動命令的目錄相關;這是非常不可能的,這是從你的Java程序啓動的同一個目錄,所以只能是它只能失敗。

第二:你使用命令解釋器。爲什麼?

第三:stdin,stdout,stderr怎麼樣?你的程序輸出什麼了嗎?如果是的話,你如何處理?

的解決方案是,一如既往地運行在Java的外部進程時,使用ProcessBuilder

final Path basedir = Paths.get("whereyourprogramislaunched"); 
final Path stdout = Paths.get("somewheretooutputstdout"); 
final Path stderr = Paths.get("somewheretooutputstderr"); 

final ProcessBuilder builder = new ProcessBuilder(
    "./bin/svm-train", "-s", "0", "-t", "0", "etc", "etc" 
); 

pb.directory(basedir.toFile()); 
pb.redirectOutput(stdout.toFile()); 
pb.redirectError(stderr.toFile()); 

final Process process = builder.start(); 

// Deal with process exit code 
相關問題