我正在尝试使用nextflow编写工作流。在我的第一个进程中,我需要创建一个文件夹来保存进程将创建的所有文件。
下面是我的流程:
params.fast5 = "/scratch/use/fast5"
params.refSeq = "/scratch/user/reference_sequences/NC_012920_OFFSET_2652.fa"
params.guppy_out = "/scratch/user/GPU/output_8"
process guppy {
input:
path fast5
path guppy_out
path refSeq
output:
path "guppy.info"
script:
"""
if [ -d "${guppy_out}" ] || test -f "${guppy_out}"
then
echo "Already exist" > debug.guppy
else
mkdir -p "${guppy_out}"
fi
job_id="$(sbatch --parsable /scratch/user/scripts/guppy_script.sh $fast5 $guppy_out $refSeq)"
echo "${job_id}" > guppy.info
"""
}
我的错误是:
mkdir: cannot create directory 'output_8': File exists
但是当我检查文件夹scratch/user/GPU/output_8时没有此名称的文件夹或文件…
我尝试用它的值"/scratch/user/GPU/output_8"
代替"${guppy_out}"
,我得到一个新的错误:
boost::filesystem::create_directories: File exists [system:17]: "output_8", "output_8">
我怎样才能正确地验证这样一个文件的存在,并在必要时创建它?
通常你不需要处理这样的问题,因为Nextflow已经为你做了:Nextflow进程是独立执行的,并且在工作目录(即./work
)中彼此隔离。注意,还可以将Nextflow配置为使用SLURM执行器,方法是向nextflow.config
添加以下内容:
process {
executor = 'slurm'
}
所以我的猜测是,有了上面的,下面的可能也适用于你:
params.fast5 = './scratch/user/fast5'
params.refSeq = './scratch/user/reference_sequences/NC_012920_OFFSET_2652.fa'
params.outdir = './results'
process guppy {
publishDir "${params.outdir}/guppy", mode: 'copy'
input:
path fast5
path refSeq
output:
path "output"
"""
mkdir output
guppy_script.sh "${fast5}" "output" "${refSeq)"
"""
}
workflow {
fast5_dir = path( params.fast5 )
fasta_file = path( params.refSeq )
guppy( fast5_dir, fasta_file )
}
上面假设你可以移动/复制你的shell脚本到一个名为"bin"的文件夹在你的项目仓库的根目录下。Nextflow自动将此文件夹添加到执行环境1中的PATH
环境变量中。如果它还不是可执行的,你可以使用chmod +x guppy_script.sh
来使它可执行。
但是我会避免使用上面的代码。很可能shell脚本的内容可以直接包含到Nextflow脚本块中。这将使您避免创建"输出"目录(这似乎是多余的),并允许您声明每个guppy输出,而不是顶级目录本身。如果你能更详细地描述一下你到底想做什么,我很乐意提供一些额外的建议。