Thread.py错误snakemake

问题描述:

我想运行一个简单的规则snakemake文件如下:Thread.py错误snakemake

resources_dir='resources' 

rule downloadReference: 
    output: 
     fa = resources_dir+'/human_g1k_v37.fasta', 
     fai = resources_dir+'/human_g1k_v37.fasta.fai', 
    shell: 
     ('mkdir -p '+resources_dir+'; cd '+resources_dir+'; ' + 
     'wget ftp://ftp-trace.ncbi.nih.gov/1000genomes/ftp/technical/reference/human_g1k_v37.fasta.gz; gunzip human_g1k_v37.fasta.gz; ' + 
     'wget ftp://ftp-trace.ncbi.nih.gov/1000genomes/ftp/technical/reference/human_g1k_v37.fasta.fai;') 

,但我得到一个错误:

Error in job downloadReference while creating output files 
    resources/human_g1k_v37.fasta, resources/human_g1k_v37.fasta.fai. 
    RuleException: 
    CalledProcessError in line 10 of 
    /lustre4/home/masih/projects/NGS_pipeline/snake_test: 
    Command 'mkdir -p resources; cd resources; wget ftp://ftp- 
    trace.ncbi.nih.gov/1000genomes/ftp/technical/reference/human_g1k_v37.fasta.gz; gunzip human_g1k_v37.fasta.gz; wget ftp://ftp-trace.ncbi.nih.gov/1000genomes/ftp/technical/reference/human_g1k_v37.fasta.fai;' returned non-zero exit status 2. 
     File "/lustre4/home/masih/projects/NGS_pipeline/snake_test", line 10, in __rule_downloadReference 
     File "/home/masih/miniconda3/lib/python3.6/concurrent/futures/thread.py", line 55, in run 
    Removing output files of failed job downloadReference since they might be corrupted: 
    resources/human_g1k_v37.fasta 
    Will exit after finishing currently running jobs. 
    Exiting because a job execution failed. Look above for error message 

我不使用线程选项在snakemake中。我无法弄清楚这是如何与thread.py相关的。任何人都有这个错误的经验?

+1

要调试这个,我建议你把它添加到你的snakefile中:http://paste.ubuntu.com/24898100/ 然后你可以追加'|| error_exit“一些错误信息”给每个单独的shell命令,以便知道在哪一步发生了故障。 – bli

+1

似乎它是gunzip命令失败。不明白为什么。它会引发警告“gzip:human_g1k_v37.fasta.gz:解压缩正常,忽略尾随垃圾”。但是,gunzip在Snakemake以外的命令行中工作正常。 – rioualen

+0

@rioulaen我得到同样的错误。 gunzip在snakemake外工作很好,但从snakemake跑步时抛出错误是很奇怪的! – user3015703

当shell命令失败时,它的退出状态不为0. 这就是“返回的非零退出状态2”表示的内容。

您的一个shell命令失败,并且失败传播到snakemake。我猜想snakemake使用线程,并且失败在threads.py文件中的某些代码的级别上显现。

# Define functions to be used in shell portions 
shell.prefix(""" 
# http://linuxcommand.org/wss0150.php 
PROGNAME=$(basename $0) 

function error_exit 
{{ 
# ---------------------------------------------------------------- 
# Function for exit due to fatal program error 
#  Accepts 1 argument: 
#   string containing descriptive error message 
# ---------------------------------------------------------------- 
    echo "${{PROGNAME}}: ${{1:-"Unknown Error"}}" 1>&2 
    exit 1 
}} 
""") 

resources_dir='resources' 

rule downloadReference: 
    output: 
     fa = resources_dir+'/human_g1k_v37.fasta', 
     fai = resources_dir+'/human_g1k_v37.fasta.fai', 
    params: 
     resources_dir = resources_dir 
    shell: 
     """ 
     mkdir -p {params.resources_dir} 
     cd {params.resources_dir} 
     wget ftp://ftp-trace.ncbi.nih.gov/1000genomes/ftp/technical/reference/human_g1k_v37.fasta.gz || error_exit "fasta download failed" 
     gunzip human_g1k_v37.fasta.gz || error_exit "fasta gunzip failed" 
     wget ftp://ftp-trace.ncbi.nih.gov/1000genomes/ftp/technical/reference/human_g1k_v37.fasta.fai || error_exit "fai download failed" 
     """ 

当我运行它,我得到以下消息后:

为了更好地理解所发生的事情,我们可以使用||操作后跟函数发出错误信息捕捉到第一个错误第一次下载的消息:

gzip: human_g1k_v37.fasta.gz: decompression OK, trailing garbage ignored 
bash: fasta gunzip failed 

事实证明,gzip使用非零退出代码警告的情况下:

退出状态通常为0;如果发生错误,退出状态为1.如果出现警告,退出状态是2

(从man gzip的诊断部)

如果删除了错误捕获|| error_exit "fasta gunzip failed",工作流是能够完成。所以我不明白为什么你首先有这个错误。

我很惊讶,gzip作者决定使用非零状态的情况下,一个简单的警告。他们添加了一个-q选项来关闭this specific warning, due to the presence of trailing zeroes,但奇怪的是,使用此选项时退出状态仍为非零。


根据约翰内斯·科斯特,snakemake作者:

对不起,误导thread.py的事情,这只是其中snakemake检测出问题的地方。真正的问题是你的命令退出时退出代码2,这表明一个错误与Snakemake无关

+0

error_exit函数不会对此代码的输出做任何更改。它在哪里写出失败的报告?它不在snakefile所在的同一目录中。 – user3015703

+0

'error_exit'函数在其后面的某个步骤失败时启用显示有用的错误消息,并退出shell而不尝试执行下一步。该错误消息应该与snakemake显示的其他内容一起出现,但它不会转到文件。 – bli

+0

其实问题是与链接,改变这个代码工作的链接就好了 – user3015703