Snakemake:捕获名称不能更改的输出文件
Snakemake: catch output file whose name cannot be changed
作为我正在构建的 Snakemake 管道的一部分,我必须使用不允许我指定输出文件的文件路径或名称的程序。
例如当 运行 在工作目录 workdir/
中运行程序时,它会产生以下输出:
workdir/output.txt
我的 snakemake 规则如下所示:
rule NAME:
input: "path/to/inputfile"
output: "path/to/outputfile"
shell: "somecommand {input} {output}"
所以每次规则 NAME 运行s,我都会在 snakemake 工作目录中得到一个额外的文件 output.txt
,如果规则 NAME 运行s 多次,它就会被覆盖或并行。
我知道影子规则,添加 shadow: "full"
让我可以简单地忽略 output.txt
文件。但是,我想保留 output.txt
并将其保存在与 outputfile
相同的目录中。有没有办法通过影子指令或其他方式实现这一目标?
我还想我可以在 somecommand
前面加上 cd
命令,但是当将其他规则链接到输出时,我可能 运行 进入下游的其他问题规则 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 应该在规则完成后将其移动到真实的输出目录运行宁.
I was also thinking I could prepend somecommand
with a cd
command, but then I'd probably run into other issues downstream when linking up other rules to the outputs of the rule NAME
.
我认为您走在正确的轨道上。每个 shell
块都是 运行 在一个单独的进程中,工作目录继承自 snakemake 进程(在命令行上用 --directory
参数指定)。因此,一个 shell
块中的 cd
命令不会影响同一规则中的其他作业或其他 downstream/upstream 作业。
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 ...
"""
作为我正在构建的 Snakemake 管道的一部分,我必须使用不允许我指定输出文件的文件路径或名称的程序。
例如当 运行 在工作目录 workdir/
中运行程序时,它会产生以下输出:
workdir/output.txt
我的 snakemake 规则如下所示:
rule NAME:
input: "path/to/inputfile"
output: "path/to/outputfile"
shell: "somecommand {input} {output}"
所以每次规则 NAME 运行s,我都会在 snakemake 工作目录中得到一个额外的文件 output.txt
,如果规则 NAME 运行s 多次,它就会被覆盖或并行。
我知道影子规则,添加 shadow: "full"
让我可以简单地忽略 output.txt
文件。但是,我想保留 output.txt
并将其保存在与 outputfile
相同的目录中。有没有办法通过影子指令或其他方式实现这一目标?
我还想我可以在 somecommand
前面加上 cd
命令,但是当将其他规则链接到输出时,我可能 运行 进入下游的其他问题规则 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 应该在规则完成后将其移动到真实的输出目录运行宁.
I was also thinking I could prepend
somecommand
with acd
command, but then I'd probably run into other issues downstream when linking up other rules to the outputs of the ruleNAME
.
我认为您走在正确的轨道上。每个 shell
块都是 运行 在一个单独的进程中,工作目录继承自 snakemake 进程(在命令行上用 --directory
参数指定)。因此,一个 shell
块中的 cd
命令不会影响同一规则中的其他作业或其他 downstream/upstream 作业。
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 ...
"""