如何在Snakemake规则中访问Profile默认资源以避免代码重复?
解决Snakemake规则中动态调用Profile默认资源的问题
方案1:直接通过workflow.default_resources获取默认资源
Snakemake的workflow对象可直接读取Profile中定义的默认资源参数,你可以在规则里直接写条件判断逻辑:
rule your_rule: input: "input/{sample}.txt" output: "output/{sample}.out" resources: cpus_per_task = 1 if wildcards.sample.endswith("_single") else workflow.default_resources["cpus_per_task"] # 替换CONDITION为你的实际判断逻辑,比如输入文件特征、wildcard参数等 shell: "your_command --threads {resources.cpus_per_task} {input} > {output}"
workflow.default_resources会自动读取当前Profile配置的default-resources,无需额外传参。
方案2:用规则继承减少代码重复
如果单线程/多线程任务的核心逻辑高度一致,仅资源配置不同,可以用规则继承抽离公共部分:
# 基础规则:包含所有公共的输入、输出、shell命令 rule base_task: input: "input/{sample}.txt" output: "output/{sample}.out" shell: "your_command --threads {resources.cpus_per_task} {input} > {output}" # 单线程规则:继承基础规则,仅覆盖资源配置 rule single_thread_task: inherit: base_task resources: cpus_per_task = 1 wildcard_constraints: sample = r".*_single" # 多线程规则:继承基础规则,使用Profile默认资源 rule multi_thread_task: inherit: base_task resources: cpus_per_task = workflow.default_resources["cpus_per_task"] wildcard_constraints: sample = r".*(?<!_single)"
这种方式避免了重复编写相同的输入输出和shell逻辑,只需维护资源配置与匹配条件。
方案3:用函数动态计算资源参数
如果条件判断逻辑复杂(比如结合输入文件大小、自定义配置等),可以定义函数返回资源值:
def get_cpu_count(wildcards, input): # 自定义条件逻辑,比如判断输入文件大小 import os if os.path.getsize(input[0]) < 1024 * 1024: return 1 else: return workflow.default_resources["cpus_per_task"] rule dynamic_resource_task: input: "input/{sample}.txt" output: "output/{sample}.out" resources: cpus_per_task = get_cpu_count shell: "your_command --threads {resources.cpus_per_task} {input} > {output}"
函数可接收wildcards、input、output等参数,实现更灵活的资源动态分配。
内容的提问来源于stack exchange,提问作者Raphael Erik Hviding
相关产品推荐
相关产品推荐

