Cluster computing snakemake在SGE上使用多个通配符提交作业时出现问题

Cluster computing snakemake在SGE上使用多个通配符提交作业时出现问题,cluster-computing,snakemake,sungridengine,Cluster Computing,Snakemake,Sungridengine,我以前在LSF集群上使用过snakemake,一切正常。然而,最近我迁移到了SGE集群,当我尝试使用多个通配符运行作业时,遇到了一个非常奇怪的错误 当我尝试根据此规则提交作业时 rule download_reads : threads : 1 output : "data/{sp}/raw_reads/{accesion}_1.fastq.gz" shell : "scripts/download_reads.sh {wildcards.s

我以前在LSF集群上使用过snakemake,一切正常。然而,最近我迁移到了SGE集群,当我尝试使用多个通配符运行作业时,遇到了一个非常奇怪的错误

当我尝试根据此规则提交作业时

rule download_reads :
    threads : 1
    output : "data/{sp}/raw_reads/{accesion}_1.fastq.gz"
    shell : "scripts/download_reads.sh {wildcards.sp} {wildcards.accesion} data/{wildcards.sp}/raw_reads/{wildcards.accesion}"
我收到以下错误(
snakemake_clust.sh
details bellow)

当我将
sp
通配符替换为常量时,它会按预期工作:

rule download_reads :
        threads : 1
        output : "data/Ecol1/raw_reads/{accesion}_1.fastq.gz"
        shell : "scripts/download_reads.sh Ecol1 {wildcards.accesion} data/Ecol1/raw_reads/{wildcards.accesion}"
也就是说,我明白了

Submitted job 1 with external jobid 'Your job 50731 ("download_reads") has been submitted'.
我想知道为什么我会有这个问题,我确信我以前在基于LSF的集群上使用了完全相同的规则,没有任何问题

一些细节 snakemake提交脚本如下所示

#!/usr/bin/env bash                                                                                                                                                                
                                                                                                                                                                                   
mkdir -p logs                                                                                                                                                                      
                                                                                                                                                                                   
snakemake $@ -p --jobs 10 --latency-wait 120 --cluster "qsub \                                                                                                                     
    -N {rule} \                                                                                                                                                                    
    -pe smp64 \                                                                                                                                                                    
    {threads} \                                                                                                                                                                    
    -cwd \                                                                                                                                                                         
    -b y \                                                                                                                                                                         
    -o \"logs/{rule}.{wildcards}.out\" \                                                                                                                                           
    -e \"logs/{rule}.{wildcards}.err\""   
-b y
使命令按原样执行,
-cwd
更改计算节点上的工作目录以及提交作业的工作目录。我希望其他标志/规格是明确的

另外,我知道
--drmaa
标志,但我认为out集群并没有为此进行良好配置<代码>--cluster到目前为止是一个更健壮的解决方案

--编辑1--

当我在本地执行完全相同的snakefile时(在fronend上,没有
--cluster
标志),脚本将按预期执行。这似乎是snakemake和调度器的交互问题

-o \"logs/{rule}.{wildcards}.out\" \                                                                                                                                           
-e \"logs/{rule}.{wildcards}.err\""   
这是一个随机猜测。。。在将多个通配符替换为
日志/{rule}.{wildcards}.err
之前,将它们按空格连接起来。因此,尽管使用双引号,SGE仍将结果字符串视为两个文件并抛出错误。如果改为使用单引号呢?比如:

-o 'logs/{rule}.{wildcards}.out' \                                                                                                                                           
-e 'logs/{rule}.{wildcards}.err'
或者,您可以在规则中连接通配符,并在命令行上使用结果。例如:

rule one:
    params:
        wc= lambda wc: '_'.join(wc)
    output: ...
然后使用:

-o 'logs/{rule}.{params.wc}.out' \                                                                                                                                           
-e 'logs/{rule}.{params.wc}.err'

(第二种解决方案,如果有效的话,有点糟糕)

如果您将这两个作业都作为交互式作业运行,而不是将它们提交到集群,会发生什么?如果我在前端运行snakemake,它会按预期工作。由于某些原因,与调度程序的交互是有问题的。哇,谢谢。我没有意识到问题将出现在我的日志规范中。单引号解决方案不会改变任何东西,事实上,第二个解决方案会在我的Snakemake文件中生成太多的锅炉板,我拒绝这样做。幸运的是,只需编写
=o日志-e日志在默认情况下会产生非常好的输出(jobname==rulename;+job ID,这意味着至少每个日志都是唯一的,我认为它是唯一的),我建议根据我最后使用的解决方案进行编辑。@KamilSJaron如果您对您的解决方案满意,最好将其作为自己的答案发布(我不介意编辑)。我很高兴接受你的建议,你首先发现了问题所在:-)@KamilSJaron如果你再添加一对引号,比如
\\“logs/{rule}.{wildcards}.out\'
(也许你需要玩转义)。我想知道第一对引号是否在到达qsub之前就被消耗掉了。
-o 'logs/{rule}.{params.wc}.out' \                                                                                                                                           
-e 'logs/{rule}.{params.wc}.err'