Snakemake集群部署:用YAML Cluster Profile替代命令行参数并支持通配符
解决Snakemake集群配置中带通配符的日志命名问题
你碰到的问题主要是对Snakemake集群配置文件的结构理解有误——配置文件的键对应Snakemake的命令行参数,而不是集群调度器(qsub)的参数。之前的错误要么是把qsub的短参数当成了Snakemake配置键,要么是没处理无通配符规则的情况。下面是完整的解决方案:
一、正确的集群配置文件写法
创建一个cluster.yaml文件(可以放在~/.config/snakemake/下,或者自定义路径),内容如下:
__default__: # 全局默认集群提交命令,把qsub的所有参数整合在这里 cluster: > qsub -q onlybngs05b -e {log_dir}/{wildcards.barcode if 'barcode' in wildcards else 'global'}.{rule}.{jobid}.err -o {log_dir}/{wildcards.barcode if 'barcode' in wildcards else 'global'}.{rule}.{jobid}.out -j y # 每个任务默认使用的核心数 cores: 1 # 日志存储目录,在cluster命令中引用这个变量 log_dir: "/home/ngs/tempOutSnakemake" # 全局作业名称规则,支持通配符和条件判断 jobname: "{wildcards.barcode if 'barcode' in wildcards else 'global'}.{rule}.{jobid}"
关键细节解释:
__default__块:定义所有规则都继承的默认配置,如果你需要给特定规则单独配置(比如minion需要更多内存),可以添加规则名的块:minion: cores: 2 cluster: > qsub -q onlybngs05b -l mem=10G -e {log_dir}/{wildcards.barcode}.{rule}.{jobid}.err -o {log_dir}/{wildcards.barcode}.{rule}.{jobid}.out -j y- 条件判断处理无通配符规则:像
catFasta这种没有barcode通配符的规则,直接用{wildcards.barcode}会报错。用{wildcards.barcode if 'barcode' in wildcards else 'global'}可以自动适配——有barcode就用通配符值,没有就用global占位。 - 把qsub参数整合到
cluster字符串中:之前你把-o/-e当成Snakemake的配置键,这是错误的——这些是qsub的参数,必须作为cluster命令的一部分写在字符串里。
二、执行命令
用--cluster-config指定配置文件,同时保留并行数参数即可:
snakemake -p --cluster-config ~/.config/snakemake/cluster.yaml -j 5 all
三、为什么之前的配置会报错?
- 参数歧义错误:你之前配置里的
o/e键,Snakemake会把它们当成自己的命令行参数,但Snakemake没有--o/--e参数,所以会提示歧义(比如--o可能匹配--omit-from等)。 - 通配符不存在错误:当规则没有
barcode通配符时,直接引用{wildcards.barcode}会触发AttributeError,必须用条件判断处理这种场景。
内容的提问来源于stack exchange,提问作者BCArg
相关产品推荐
相关产品推荐

