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 回答