依赖Checkpoint输出的Snakemake Rule被跳过问题求助
Snakemake中sub规则被忽略的问题解决
问题原因分析
核心原因:规则未进入依赖链
Snakemake仅执行最终目标依赖链覆盖的规则。你的sub规则输出sub_out.out既没有被后续的checkpoint b依赖,也没有被指定为运行时的目标,因此Snakemake会直接跳过该规则。语法错误雪上加霜
原Snakefile存在3处语法问题:
sub规则引用checkpoint时误用单数checkpoint.a.get,正确写法应为复数checkpoints.a.getcheckpoint a的output参数列表中,info行末尾缺少逗号checkpoint b的input参数列表中,zip行末尾缺少逗号
解决方案
方案1:直接指定sub为目标运行
在命令行明确指定sub的输出或规则名作为执行目标:
# 指定输出文件 snakemake sub_out.out --forceall -n # 或直接指定规则名 snakemake --rule sub --forceall -n
方案2:让后续规则依赖sub的输出(若业务逻辑需要)
如果sub的输出是checkpoint b的前置依赖,修改checkpoint b的input:
checkpoint b: input: zip = lambda wc: checkpoints.a.get(**wc).output.zip, some_other_file = "some_other_file.txt", sub_out = "sub_out.out" # 添加对sub输出的依赖 output: "cbout.out"
方案3:设置默认目标规则
在Snakefile末尾添加rule all,指定所有需要生成的文件作为默认执行目标:
rule all: input: "sub_out.out", "cbout.out"
之后直接运行snakemake,会自动执行生成这两个文件的完整依赖链。
修正后的完整Snakefile
checkpoint a: input: "some_bam.bam" output: info="some_info.info", zip="some_zip.gz" rule sub: input: info = lambda wc: checkpoints.a.get(**wc).output.info, file = "some_file.txt" output: "sub_out.out" checkpoint b: input: zip = lambda wc: checkpoints.a.get(**wc).output.zip, some_other_file = "some_other_file.txt" output: "cbout.out" # 可选:取消注释启用默认目标 # rule all: # input: # "sub_out.out", # "cbout.out"
内容的提问来源于stack exchange,提问作者user24790338
相关产品推荐
相关产品推荐

