我使用的脚本都将输出文件放到调用脚本的当前目录中,所以在我的shell脚本管道中我会有cd命令转到特定目录运行命令和输出文件只会保存在相关的目录。我的脚本没有输出目录的参数,大多数都获得从输入中推导出的输出文件名。这对我来说非常好。
现在我一直在遇到这个输出目录问题,因为snakemake似乎将文件输出到Snakefile所在的目录。我可以修改所有脚本以获取输出目录的附加参数,但这对于修改许多脚本来说已经很痛苦了。我想知道是否有任何方法可以指定每个特定规则的输出位置?
答案 0 :(得分:3)
这是我在我的一个snakefiles中使用的示例规则:
rule link_raw_data:
output:
OPJ(data_dir, "{lib}_{rep}.fastq.gz"),
params:
directory = data_dir,
shell_command = lib2data,
message:
"Making link to raw data {output}."
shell:
"""
(
cd {params.directory}
{params.shell_command}
)
"""
这可能与您的情况略有不同,但希望有些技术可以提供帮助。请特别注意shell
部分中的括号以及params
部分的用法来定义输出目录。
我不确定我是以最优雅的方式做到这一点,但它确实有效。
data_dir
是从配置文件中读取的参数。
lib2data
是一个根据某些通配符的值生成命令的函数。我必须确保这些命令当然使用正确的输入文件路径(在这种情况下,输出也与output
部分所说的内容一致)。在您的情况下,您可能只需要一个“硬编码”shell命令,可能使用一些规则的输入。
rule run_script1:
input:
path/to/initial/input
output:
script1_out/output1
shell:
""""
cd script1_out
script1 {input}
""""
rule run_script2:
input:
script1/output1
output:
script2/output2
shell:
"""
cd script2_out
script2 {input}
"""
从这些示例开始,您可以根据需要在输入或输出中使用通配符的函数。
答案 1 :(得分:2)
一个hack将首先进入输出目录,即“cd $(dirname {output [0]})”。这需要是shell命令中的第一个。
话虽如此,最好将脚本更改为接受输出目录作为参数。
安德烈亚斯
答案 2 :(得分:1)
您可以尝试使用YAML或JSON中的配置文件。然后在扩展或规则的输入/输出中将目录用作参数。
请参阅文档here
答案 3 :(得分:1)
在snakemake文档中:
" snakefile中的所有路径都是相对于执行snakemake的目录进行解释的。可以通过在snakefile中指定workdir来覆盖此行为:"
workdir: "path/to/workdir"
因此,只需将其放在snakefile的开头,所有输入和输出都将相对于此路径进行解释。