You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake动态为各规则设置含规则名的日志文件报错求助

Snakemake动态设置规则日志文件名的解决思路

方案1:用内置变量直接生成(最省心)

Snakemake自带{rule}变量,直接写在log指令里就能自动替换成当前规则名称,根本不用遍历修改:

logs_dir = config['logs_dir']

rule all:
    input: 'b'

rule myrule:
    input: 'a'
    output: 'b'
    log: os.path.join(logs_dir, "{rule}.log")
    shell:
        """
        cp {input} {output}
        """

所有规则都这么写就行,日志文件名自动变成规则名.log。

方案2:修复set_log的用法

非要用遍历修改的话,得解决几个坑:

  • 跳过没定义log的规则:比如all规则默认没log,硬改会触发断言错误
  • 对应log的键名:规则里定义的是dummy = 'dummy.log',set_log就得传dummy=...,不能瞎用real这种不存在的键
  • 遍历代码要放最后:得等所有规则都定义完再遍历workflow.rules

改完的代码示例:

rule all:
    input: 'b'

rule myrule:
    input: 'a'
    output: 'b'
    log: dummy = 'dummy.log'
    shell:
        """
        cp {input} {output}
        """

# 必须放在所有规则定义之后
for r in workflow.rules:
    if hasattr(r, 'log'):
        # 对应规则里的log键名dummy
        r.set_log(dummy=r.name + '.log')

方案3:批量创建规则时直接指定

如果是批量生成规则,创建的时候直接把log设置好:

logs_dir = config['logs_dir']
rule_names = ['rule1', 'rule2']

for name in rule_names:
    rule:
        name: name
        input: f'{name}_in.txt'
        output: f'{name}_out.txt'
        log: os.path.join(logs_dir, f'{name}.log')
        shell:
            """
            # 写你的命令逻辑
            """

内容的提问来源于stack exchange,提问作者soungalo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:21:34