2012-01-27 3 views
0

FreeSurfer의 mri_convert를 실행하기 위해 시스템 명령을 실행하려고합니다. mri_convert가 무엇인지 이해할 필요가 없습니다. 프로세스가 스칼라에서 시스템으로 어떻게 전송되는지 이해해야 만합니다. 이 코드는 대부분 작동하지만 공백이있는 파일 경로를 보내려고하면 공백을 \으로 바꾼 후에도 파일이 손상됩니다. 아래에 코드를 게시하고 그 출력은 공백이있는 디렉토리가있는 파일 경로에서 경로에 공백이 포함 된 디렉토리가없는 파일을 사용합니다. 공간 디렉토리없이스칼라 시스템 프로세스 및 공백

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/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 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] 

출력 디렉토리 path는 대괄호 안에있는 디렉토리의 공백을 사용합니다. 그러므로, 나는 내 과정이 어떻게 만들어 지는지에 대해 재미있는 일이 있다고 믿는다. 더 중요한 것은, 각 상황에서 터미널의 경로 값을 잘라내어 붙여 넣으면 mri_convert 프로그램이 예상대로 실행된다는 것입니다.

미리 감사드립니다. 자세한 내용이 필요하면 알려주십시오.

답변

6

올바른 순서로 구문 분석하기 위해 뭔가를 얻으려고하는 대신 인수 시퀀스에서 프로세스를 만드는 것이 좋습니다. 이렇게하려면 stringSeqToProcess 암시 적 메서드를 사용합니다.

각 인수를 별도의 줄에 인쇄하는 셸 스크립트를 만들었습니다. 좋은 측정을 위해서 나는 스크립트의 경로에 공백을 넣었다. 그런 다음 스칼라에서 실행할 수있었습니다.

import scala.sys.process._ 
Seq("/home/lwickland/sp ace/script.sh", "a1", "/path/with a/sp ace", "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 
} 

가 작동하지 않는 경우 알려 주시기 바랍니다 :

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

나는처럼되고 코드를 수정하려고 좋을 것.

+0

스크립트가 실행 가능으로 표시되어 있습니까? –

+0

이 방법을 시도하기 위해 사용하고있는 코드를 기꺼이 게시 하시겠습니까? –

+0

Seq()의 첫 번째 인수로 "sh"를 추가하여 실행 파일로 표시하지 않은 쉘 스크립트를 실행할 수있었습니다. 'Seq ("sh", "/ home/lwickland/spce/script.sh", "a1", "/ path/a/sp 에이스", "c")! 당신의 길에서 "쉬"해야합니다. 그렇지 않다면 "/ bin/sh"와 같은 것을 넣어야합니다. –

관련 문제