作为我正在构建的蛇形管道的一部分,我必须使用一个不允许我指定文件路径或输出文件名称的程序。
。在工作目录workdir/
下运行程序,输出如下:workdir/output.txt
我的蛇形规则是这样的:
rule NAME:
input: "path/to/inputfile"
output: "path/to/outputfile"
shell: "somecommand {input} {output}"
因此,每次运行规则NAME时,我都会在snakemake工作目录中获得一个额外的文件output.txt
,如果规则NAME多次运行或并行运行,则该文件将被覆盖。
我知道阴影规则,添加shadow: "full"
允许我简单地忽略output.txt
文件。但是,我想保留output.txt
并将其保存在与outputfile
相同的目录中。是否有一种方法来实现这一点,无论是与影子指令或其他?
我还认为我可以用cd
命令前置somecommand
,但是当将其他规则链接到规则NAME
的输出时,我可能会在下游遇到其他问题。
如何在shell部分直接移动它(提供somecommand
成功完成)?
rule NAME:
input: "path/to/inputfile"
output: "path/to/outputfile"
params:
output_dir = "path/to/output_dir",
shell: "somecommand {input} {output} && mv output.txt {params.output_dir}/output.txt"
编辑:对于多个并行执行的NAME,结合shadow: "full"
可以工作:
rule NAME:
input: "path/to/inputfile"
output:
output_file = "path/to/outputfile"
output_txt = "path/to/output_dir/output.txt"
shadow: "full"
shell: "somecommand {input} {output.output_file} && mv output.txt {output.output_txt}"
应该在它自己的临时目录中运行规则的每次执行,并且通过指定移动的output.txt作为输出,一旦规则完成运行,Snakemake应该将其移动到真正的输出目录。
我认为你的思路是对的。每个我还认为我可以用
cd
命令前置somecommand
,但是当将其他规则链接到规则NAME
的输出时,我可能会遇到下游的其他问题。
shell
块在一个单独的进程中运行,其工作目录继承自snakemake进程(使用命令行上的--directory
参数指定)。因此,一个shell
块中的cd
命令不会影响来自同一规则的其他作业或其他下游/上游作业。
rule NAME:
input: "path/to/inputfile"
output: "path/to/outputfile"
shell:
"""
input_file=$(realpath "{input}") # get the absolute path, before the `cd`
base_dir=$(dirname "{output}")
cd "$base_dir"
somecommand ...
"""