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
相关产品推荐
相关产品推荐

