在SGE集群使用Snakemake提交多通配符作业时出错
嘿,咱们先把问题根源搞清楚:你碰到的ERROR! two files are specified for the same host错误,其实是Snakemake生成的日志文件名带了特殊字符,被SGE的qsub命令误判了。
当规则里有多个通配符时,{wildcards}会被展开成类似sp=Ecol1, accesion=SRA123456的字符串——这里的逗号和空格是麻烦制造者!qsub会把逗号当成参数分隔符,把这个展开后的字符串拆成好几个部分,误以为你指定了多个日志文件路径,所以直接报错。而你把sp改成常量后,{wildcards}只展开成accesion=SRA123456,没有逗号,qsub就能正确识别路径了,这也验证了咱们的判断。
下面给你两个靠谱的解决方案:
方案1:逐个指定通配符生成日志文件名
直接在集群参数里明确写出每个wildcard变量,别用包含特殊字符的{wildcards}整体:
修改你的snakemake_clust.sh里的--cluster段:
--cluster "qsub \ -N {rule} \ -pe smp64 {threads} \ -cwd \ -b y \ -o \"logs/{rule}.{wildcards.sp}.{wildcards.accesion}.out\" \ -e \"logs/{rule}.{wildcards.sp}.{wildcards.accesion}.err\""
这样生成的日志文件名会是download_reads.Ecol1.SRA123456.out,完全没有特殊字符,qsub能正常解析。
方案2:对{wildcards}做字符串转义
要是你不想挨个写wildcard,可以用Snakemake的字符串替换功能,把{wildcards}里的逗号和空格换成合法字符(比如点号):
--cluster "qsub \ -N {rule} \ -pe smp64 {threads} \ -cwd \ -b y \ -o \"logs/{rule}.{wildcards|replace(', ', '.')}.out\" \ -e \"logs/{rule}.{wildcards|replace(', ', '.')}.err\""
这个写法会把sp=Ecol1, accesion=SRA123456转换成sp=Ecol1.accesion=SRA123456,同样避开了逗号导致的解析问题。
最后验证一下:修改完脚本重新提交作业,应该就能像单通配符的情况那样,正常返回Your job XXXX ("download_reads") has been submitted的提示了。你提到本地运行没问题,这也完全符合咱们的分析——本地不需要经过qsub解析参数,自然不会触发这个特殊字符的坑。
内容的提问来源于stack exchange,提问作者Kamil S Jaron

