如何编写无输出的Snakemake规则并使其触发其他规则?
搞定Snakemake无输出规则的触发问题
嘿,这个场景我太熟悉了!Snakemake是靠文件依赖关系驱动工作流的,没有显式输出的规则,它默认会认为“没有需要生成的目标”,自然不会主动触发。要满足你提的两个需求,最靠谱的办法就是给print_to_screen加个虚拟标记文件当输出,用它来告诉Snakemake这个规则需要被执行。
下面是修改后的完整Snakefile:
rule all: output: ".workflow_finished" # 总标记文件,也可以直接用print规则的标记 rule create_file: output: "file.txt" shell: "echo Hello World! > {output}" rule print_to_screen: output: ".print_executed" # 虚拟标记文件,用来追踪规则是否执行过 input: "file.txt" shell: """ touch {output} # 先创建标记文件,让Snakemake知道规则已经完成 cat {input} # 执行你要的屏幕打印操作 """
为啥这么写?给你拆解开说:
- 给print规则加虚拟输出:
.print_executed就是个空文件,Snakemake会盯着它——如果这个文件不存在,就会触发print_to_screen规则;又因为它依赖file.txt,所以会先自动跑create_file生成输入文件,完美联动。 - 纳入rule all的两种玩法:
- 最简单的:直接把
print_to_screen的标记文件放进rule all的输出:
这样运行rule all: output: ".print_executed"snakemake时,会先搞定create_file,再执行打印操作,一步到位。 - 更灵活的(适合复杂工作流):整个总标记文件,让它依赖print规则的标记:
以后要是加新规则,只要把新规则的标记加到rule all: output: ".workflow_finished" input: ".print_executed" shell: "touch {output}"rule all的输入里就行,扩展性拉满。
- 最简单的:直接把
完全满足你的要求:
- 单独触发规则:运行
snakemake .print_executed,Snakemake发现标记文件不存在,会先跑create_file生成file.txt,再执行cat打印内容,最后创建标记文件。 - 一键跑全流程:直接运行
snakemake,因为rule all依赖print规则的标记,会自动触发整个工作流,从生成文件到打印内容全搞定。
要是你实在不想生成物理文件,也可以折腾临时文件或者shadow规则,但说实话虚拟标记文件是最简洁可靠的——完全贴合Snakemake的核心逻辑,不容易出奇怪的bug。
内容的提问来源于stack exchange,提问作者Carlo Ponzi
相关产品推荐
相关产品推荐

