如何在Snakemake中获取命令行指定目标规则优化前置Python代码
如何根据Snakemake目标规则执行必要的前置Python操作
Snakemake中并没有snakemake.target_rule这个变量,正确获取命令行指定目标规则的方式是使用workflow.target_rules——它是一个包含所有目标规则对象的列表,每个规则对象的name属性对应规则名称。
你可以通过判断目标规则集合来选择性执行前置操作,既支持单个目标,也支持多个目标同时指定的场景。修正后的实现示例如下:
def do_work_for_target_a(): # 这里写目标a需要的前置操作:查询文件、访问数据库、过滤数据框等 print("执行目标a的前置工作") return "table_a_processed_data" def do_work_for_target_b(): # 这里写目标b需要的前置操作 print("执行目标b的前置工作") return "table_b_processed_data" # 获取命令行指定的所有目标规则名称 target_rule_names = {rule.name for rule in workflow.target_rules} table_a = None table_b = None # 根据目标规则判断需要执行的前置操作 if "a" in target_rule_names: table_a = do_work_for_target_a() if "b" in target_rule_names: table_b = do_work_for_target_b() # 如果没有指定具体目标(比如执行默认的rule all),则执行所有前置操作 if not target_rule_names or "all" in target_rule_names: table_a = do_work_for_target_a() table_b = do_work_for_target_b() rule all: input: "output_a.txt", "output_b.txt" rule a: output: "output_a.txt" shell: # 示例:使用前置操作生成的table_a变量 'echo "{table_a}" > {output}' rule b: output: "output_b.txt" shell: 'echo "{table_b}" > {output}'
关键说明
workflow.target_rules的用法:这个内置对象会返回用户在命令行指定的所有目标规则(比如执行snakemake a时,它包含rule a的对象;执行snakemake a b时,包含rule a和rule b的对象)。- 多目标兼容:用集合存储目标规则名称,可以轻松处理用户同时指定多个目标的情况,确保对应的前置操作都被执行。
- 默认规则处理:如果用户没有指定具体目标(直接执行
snakemake),会默认执行rule all,此时需要执行所有前置操作。
内容的提问来源于stack exchange,提问作者Wouter De Coster
相关产品推荐
相关产品推荐

