Snakemake:不能更改名称的catch输出文件



作为我正在构建的蛇形管道的一部分,我必须使用一个不允许我指定文件路径或输出文件名称的程序。

。在工作目录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 ...
"""

最新更新