2012-12-11 2 views
1

저는 graphviz를 사용하여 스칼라 프로그램에서 전달 된 메시지를 기반으로 그래프를 생성하고 있습니다. scala 프로그램 내부에서 graphviz 응용 프로그램을 호출하려면 exec() 메소드 (Java와 유사)를 사용하고 있습니다. 성공적으로 명령을 실행하고 난 다음 코드 사용시 그래프를 작성 :스칼라 - 특정 시나리오에서 터미널을 통해 프로세스를 실행하지 못합니다.

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

어떤 OS를 사용하고 있습니까? – Faiz

+0

@Faiz 우분투를 사용하고 있습니다. 12.04 –

+0

어떤 종류의 오류가 있습니까? – Faiz

답변

3

exec가 셸이 아닙니다 ... 예 : 따옴표는 예상대로 작동하지 않으므로 경로 (공백이 포함될 수 있음)는 예상대로 처리되지 않습니다. 이 명령은 StringTokenizer를 사용하여 구분되며, 리터럴 따옴표는 ... 보통입니다.

배열을 대신 사용하는 exec 형식을 사용하면 명령을 올바르게 토큰화할 수 있습니다.

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