2017-06-18 42 views
1

我想運行一個簡單的規則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

回答

1

當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