我正在使用 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) ;
}
通过终端执行相同的命令会给出正确的输出。你能帮我找到我丢失的东西吗?
最佳答案
exec 不是 shell...例如引用不会像您期望的那样工作,因此您的路径(可能包含空格等)将不会像您期望的那样被处理。该命令将使用 StringTokenizer 分解,您的文字引号将是......好吧......文字。
改用采用数组的 exec 形式,这样您就可以正确标记命令。
val args = Array[String]("dot", "-Tpng", GraphFileObj.getAbsolutePath, ...);
run.exec(args)
关于java - Scala - 在特定场景下无法通过终端执行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13815404/