在snakemake中没有给出通配符错误的值

问题描述 投票:2回答:1

我正在尝试使用snakemake创建一个简单的管道从Web下载两个文件,然后将它们合并为一个输出。

我认为可行的是以下代码:

dwn_lnks = {
    '1': 'https://molb7621.github.io/workshop/_downloads/sample.fa',
    '2': 'https://molb7621.github.io/workshop/_downloads/sample.fa'       
    }
import os

# association between chromosomes and their links
def chromo2link(wildcards):
    return dwn_lnks[wildcards.chromo]

rule all:
    input:
        os.path.join('genome_dir', 'human_en37_sm.fa')

rule download:
    output:
        expand(os.path.join('chr_dir', '{chromo}')),
    params:
        link=chromo2link,
    shell:
        "wget {params.link} -O {output}"


rule merger:
    input:
        expand(os.path.join('chr_dir', "{chromo}"), chromo=dwn_lnks.keys())
    output:
        os.path.join('genome_dir', 'human_en37_sm.fa')
    run:
        txt = open({output}, 'a+')
        with open (os.path.join('chr_dir', "{chromo}") as file:
                    line = file.readline()
                    while line:
                        txt.write(line)
                        line = file.readline()
        txt.close()

此代码返回错误:No values given for wildcard 'chromo'. in line 20

此外,在合并规则中,运行中的python代码不起作用。

snakemake包中的教程没有足够的示例来学习非计算机科学家的详细信息。如果有人知道学习如何使用snakemake的良好资源,我将不胜感激,如果他能分享。

python snakemake
1个回答
3
投票

问题是你在规则expand的输出中有一个download函数,它没有定义通配符{chromo}的值。我想你真正想要的是

rule download:
output:
    'chr_dir/{chromo}',
params:
    link=chromo2link,
shell:
    "wget {params.link} -o {output}"

没有expandexpand函数只需要通过通配符聚合,就像你在规则merger中那样。

另请参阅官方的Snakemake教程,该教程详细解释了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.