Snakemake引入include规则文件后执行异常,误判文件已存在
Snakemake主文件执行无任务,但单独运行规则文件正常
问题场景
项目文件夹结构:
├── config │ └── config.yaml ├── results ├── Snakefile └── workflow ├── envs ├── report ├── rules │ └── download.smk └── scripts
主Snakefile通过以下语句引入规则文件:
include: 'workflow/rules/download.smk'
download.smk内容:
configfile: './././config/config.yaml' rule all: input: config["data_dir"] + "/ACBarrie_R1.fastq.gz", config["data_dir"] + "/ACBarrie_R2.fastq.gz", config["ref_dir"] + "/reference.fasta" rule download_dataset: output: read1 = config["data_dir"] + "/ACBarrie_R1.fastq.gz", read2 = config["data_dir"] + "/ACBarrie_R2.fastq.gz", reference = config["ref_dir"] + "/reference.fasta" params: read1_url = config['samples']['read1_url'], read2_url = config['samples']['read2_url'], genome = config['genome'] threads: config['cores']['download_dataset'] shell: """ wget -O {output.read1} {params.read1_url} wget -O {output.read2} {params.read2_url} wget -O {output.reference} {params.genome} """
执行主Snakefile时出现提示:
Assuming unrestricted shared filesystem usage. Building DAG of jobs... Nothing to be done (all requested files are present and up to date).
但实际目标文件并未生成;而单独执行命令snakemake -s workflow/rules/download.smk --cores 2时,规则能正常运行并生成文件。
核心原因
- Rule All 被全局覆盖:Snakemake 仅允许存在一个
rule all作为全局最终目标。若主Snakefile中已定义rule all,引入download.smk后,其内部的rule all会被主文件的规则覆盖,导致主流程的rule all未包含下载任务的输出文件,Snakemake因此判定无任务需要执行。 - 重复加载配置的潜在冲突:
download.smk中独立加载配置文件,而主Snakefile若也加载了配置,可能因路径解析或变量重复导致config["data_dir"]等路径与预期不符,使Snakemake错误判定目标文件已存在。
解决方法
统一全局目标规则
- 删除
download.smk中的rule all定义 - 在主Snakefile的
rule all中添加下载任务的输出文件:# 主Snakefile configfile: 'config/config.yaml' include: 'workflow/rules/download.smk' rule all: input: config["data_dir"] + "/ACBarrie_R1.fastq.gz", config["data_dir"] + "/ACBarrie_R2.fastq.gz", config["ref_dir"] + "/reference.fasta", # 其他主流程目标文件...
- 删除
统一配置加载
- 移除
download.smk中的configfile: './././config/config.yaml'语句 - 在主Snakefile中统一加载配置,避免重复加载引发的变量冲突
- 移除
显式指定运行目标
若不想修改规则结构,可直接在运行主Snakefile时指定下载任务或目标文件:# 直接运行下载规则 snakemake --cores 2 download_dataset # 或指定具体目标文件 snakemake --cores 2 config["data_dir"]/ACBarrie_R1.fastq.gz config["data_dir"]/ACBarrie_R2.fastq.gz config["ref_dir"]/reference.fasta
内容的提问来源于stack exchange,提问作者George Odette
相关产品推荐
相关产品推荐

