Snakemake如何针对单个通配符按执行顺序进行dry run
Snakemake能否针对单个通配符按实际执行顺序开展dry run
执行常规dry run时,输出末尾会显示作业计数信息,同时默认提示输出顺序不代表实际执行顺序,示例输出如下:
Job counts: count jobs 1 all 1 assembly_eval 5 cat_fastq 1 createGenLogDir 5 createLogDir 5 flye 5 medaka_first 5 medaka_second 5 minimap_first 5 quast_medaka_first 5 quast_medaka_second 5 quast_racon_first 5 racon_first 5 symLinkFQ 58 This was a dry-run (flag -n). The order of jobs does not reflect the order of execution.
当前期望实现两个核心功能:
- 获取单个通配符对应的dry run命令(聚合规则除外):同一规则下不同作业的命令仅input、output、param指令中的通配符取值存在差异,不需要输出同规则的冗余重复内容
- 按照实际执行顺序打印工作流,提升可视化效果
通过snakemake -h未找到匹配的内置参数,期望找到类似--rulegraph相对于--dag的去冗余效果的对应功能,如果暂无成熟简便的解决方案,将在项目GitHub页面提交功能增强建议。
可行实现方案
提取单个通配符对应的dry run命令
可以直接指定目标通配符对应的输出文件作为执行目标,搭配参数执行dry run:snakemake -n -p 你的目标输出文件路径
该命令只会打印生成该目标文件所需的、对应当前通配符取值的所有作业命令,不会输出其他通配符对应的作业内容。
如果需要批量获取所有通配符取值的对应命令,可以先通过snakemake --list拿到所有预期生成的输出文件列表,循环传入上述命令即可。如果需要提取规则级的命令模板,可以通过snakemake --summary拿到所有作业的通配符映射关系,提取单条规则的命令框架后替换对应通配符取值即可,不需要手动解析全量作业输出。
按实际执行顺序输出工作流
默认dry run不输出真实执行顺序,是因为Snakemake实际运行时会根据可用资源、作业优先级动态调整同层级无依赖作业的执行顺序,不存在绝对固定的执行序列。如果需要获取符合依赖逻辑的调度顺序,可以通过两种方式实现:
- 执行dry run时加上
--cores N参数(N为你实际运行时设置的核心数),此时Snakemake会完整模拟调度过程,输出的作业顺序和实际运行时的优先级调度顺序一致,不会再出现「顺序不反映实际执行」的提示 - 如果需要规则级的去冗余执行顺序,可以先用
snakemake --rulegraph输出规则间的依赖关系图,对图中节点做拓扑排序即可得到规则层面的先后执行顺序,和--rulegraph相对于--dag的去冗余逻辑完全一致。
如果上述操作对你的使用场景来说过于繁琐,可以提交功能增强建议,目前Snakemake官方稳定版还没有内置一键实现「单通配符维度去冗余+按执行顺序输出dry run结果」的专用参数。
内容的提问来源于stack exchange,提问作者BCArg
相关产品推荐
相关产品推荐

