Scala系统进程和空白

时间:2012-01-27 19:49:08

标签: scala process system

我正在尝试发出一个系统命令来运行FreeSurfer的mri_convert。您不需要了解mri_convert是什么,就像您必须了解进程如何从scala转移到系统一样。代码大部分都可以工作,但是当我尝试发送带有空格的文件路径时,它会中断(即使我用\替换空格)。我将在下面发布我的代码,然后使用不包含路径空间的目录的文件,然后从带有空格的目录的文件路径发布输出。

def executeAll(): Boolean = {
  while (dataBuf.length != 0) {
    val dir = directory + "subjects/" + dataBuf.first.subjectID + "/mri/orig"
    val expr = """\s+""".r  
    val path = expr.replaceAllIn((dataBuf.first.path), """\\ """)
    val folder = new File(dir)
    val execute = freesurfer + """bin/mri_convert -it dicom -ot mgz -ii """ + path + """ -oi """ + dir + """/001.mgz"""
    if (folder.mkdirs()) {
      val command = Process(execute, folder, ("FREESURFER_HOME", freesurfer))
      val exitCode = command.!
      println(command.toString())
    }
    dataBuf.remove(dataBuf.indexOf(dataBuf.first))
  }
  println("DONE")
  dataListView.listData = dataBuf
  true
} 

没有带空格的目录的输出:

val path = /Applications/freesurfer/bin/mri_convert -it dicom -ot mgz -ii /Volumes/N/0110547/2008-05-24/data/BIRNSequence_4/IM-0003-0001.dcm -oi /Users/michael/Documents/subjects/dadasd/mri/orig/001.mgz 

[/Applications/freesurfer/bin/mri_convert, -it, dicom, -ot, mgz, -ii, /Volumes/N/0110547/2008-05-24/data/BIRNSequence_4/IM-0003-0001.dcm, -oi, /Users/michael/Documents/subjects/dadasd/mri/orig/001.mgz]

带空格的输出目录:

val path = /Applications/freesurfer/bin/mri_convert -it dicom -ot mgz -ii /Volumes/N/0110547/2005-07-31/this\ is\ the\ data/AXBIRN_4/IM-0004-0001.dcm -oi /Users/michael/Documents/subjects/adsfsdf/mri/orig/001.mgz 

mri_convert: extra arguments ("the\" and following)
 [/Applications/freesurfer/bin/mri_convert, -it, dicom, -ot, mgz, -ii, /Volumes/N/0110547/2005-07-31/this\, is\, the\, data/AXBIRN_4/IM-0004-0001.dcm, -oi, /Users/michael/Documents/subjects/adsfsdf/mri/orig/001.mgz]

我认为这与传递给系统的参数在目录中用空格打破路径这一事实有关,如括号中所示。因此,我相信我的流程是如何创建的。更重要的是,在每种情况下,如果我将路径的val剪切并粘贴到终端,则mri_convert程序将按预期执行。

提前致谢,如果需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:7)

我建议从一系列参数创建你的进程,而不是试图让下游的东西正确地解析它们。为此,您使用stringSeqToProcess隐式方法。

我创建了一个shell脚本,它在一个单独的行上打印出每个参数。为了更好的衡量,我在脚本的路径中添加了一个空格。然后我能够从Scala执行它:

import scala.sys.process._
Seq("/home/lwickland/sp ace/script.sh", "a1", "/path/with a/sp ace", "c")!

shell脚本将包含空格的参数视为单个项目。

Arg: a1
Arg: /path/with a/sp ace
Arg: c

我建议您尝试将代码修改为:

def executeAll(): Boolean = {
  while (dataBuf.length != 0) {
    val dir = directory + "subjects/" + dataBuf.first.subjectID + "/mri/orig"
    val folder = new File(dir)
    val execute = Seq("sh", freesurfer + "bin/mri_convert", "-it", "dicom", "-ot", "mgz", "-ii", path, "-oi", dir +"/001.mgz")
    if (folder.mkdirs()) {
      val command = Process(execute, folder, ("FREESURFER_HOME", freesurfer))
      val exitCode = command.!
      println(command.toString())
    }
    dataBuf.remove(dataBuf.indexOf(dataBuf.first))
  }
  println("DONE")
  dataListView.listData = dataBuf
  true
} 

如果不起作用,请告诉我。