1

私は、graphviz を使用して、scala プログラムで渡されたメッセージに基づいてグラフを生成しています。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) ;

ただし、入力ファイルと出力ファイルのパスを変更すると実行に失敗します(以下に示すように、入力ファイルと出力ファイルが存在するディレクトリを含めました)

  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) ;

  }

端末から同じコマンドを実行すると、適切な出力が得られます。足りないものを見つけるのを手伝ってくれませんか?

4

1 に答える 1

3

exec はシェルではありません...たとえば、引用符は期待どおりに機能しないため、パス (スペースなどを含む場合があります) は期待どおりに処理されません。コマンドは StringTokenizer を使用して分割され、リテラルの引用符は...まあ..リテラルになります。

代わりに配列を取る exec の形式を使用して、コマンドを正しくトークン化できるようにします。

val args = Array[String]("dot", "-Tpng", GraphFileObj.getAbsolutePath, ...);
run.exec(args)
于 2012-12-11T07:46:11.563 に答える