MRN*_*MRN 1 scala system process
我试图发出一个系统命令来运行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
}
Run Code Online (Sandbox Code Playgroud)
没有带空间的目录的输出:
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]
Run Code Online (Sandbox Code Playgroud)
带空格的输出目录:
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]
Run Code Online (Sandbox Code Playgroud)
我认为这与传递给系统的参数在目录中用空格打破路径这一事实有关,如括号中所示.因此,我相信我的流程是如何创建的.更重要的是,在每种情况下,如果我将路径的val剪切并粘贴到终端,则mri_convert程序将按预期执行.
在此先感谢,如果需要更多详细信息,请告诉我.
我建议从一系列参数创建你的进程,而不是试图让下游的东西正确地解析它们.为此,您使用stringSeqToProcess隐式方法.
我创建了一个shell脚本,它在一个单独的行上打印出每个参数.为了更好的衡量,我在脚本的路径中放置了一个空格.然后我能够从Scala执行它:
import scala.sys.process._
Seq("/home/lwickland/sp ace/script.sh", "a1", "/path/with a/sp ace", "c")!
Run Code Online (Sandbox Code Playgroud)
shell脚本将包含空格的参数视为单个项目.
Arg: a1
Arg: /path/with a/sp ace
Arg: c
Run Code Online (Sandbox Code Playgroud)
我建议尝试修改你的代码:
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
}
Run Code Online (Sandbox Code Playgroud)
如果不起作用,请告诉我.