2012-12-11 57 views
1

我正在使用graphviz基於在scala程序中傳遞的消息生成圖。 爲了從scala程序中調用graphviz應用程序,我使用了exec()方法(類似於Java)。它成功地執行命令和創建的圖形時我用下面的代碼片斷:Scala - 無法在特定場景中通過終端執行進程

var cmd: String = "dot -Tpng Graph.dot -o Graph.png" 
var run: Runtime = Runtime.getRuntime() ; 
var pr: Process = run.exec(cmd) ; 

但是它無法改變輸入和輸出的文件的路徑之後執行(I只是包括一個目錄內,其輸入文件並輸出文件如下所示)

def main(args: Array[String]): Unit = { 

    var DirectoryName: String = "Logs" 

    var GraphFileName: String = DirectoryName + File.separator + "Graph.dot"  
    val GraphFileObj: File = new File(GraphFileName) 

    // var cmd: String = "dot -Tpng Graph.dot -o Graph.png" 
    var cmd: String = "dot -Tpng \"" + GraphFileObj.getAbsolutePath + "\" -o \"" + DirectoryName + File.separator + "Graph.png\"" ; 
    println(cmd) 

    var run: Runtime = Runtime.getRuntime() ; 
    var pr: Process = run.exec(cmd) ; 

    } 

通過終端執行相同的命令可以提供正確的輸出。你能幫我找到我失蹤的東西嗎?

+0

你在使用什麼操作系統? – Faiz

+0

@Faiz我使用的是Ubuntu 12.04 –

+0

你會得到什麼樣或錯誤? – Faiz

回答

3

exec不是shell ...例如。引用不會按預期工作,因此您的路徑(可能包含空格等)將不會按照您的預期進行處理。該命令將使用StringTokenizer進行分解,並且您的文字引號將是... well..literal。

使用exec的形式來取代數組,因此可以正確標記命令。

val args = Array[String]("dot", "-Tpng", GraphFileObj.getAbsolutePath, ...); 
run.exec(args)