Snakemake中输出的数量不同(已知)

Dio*_*ion 3 snakemake

我有一个Snakemake规则,可以处理数据存档,并基本上解压缩其中的数据.档案包含我在规则开始之前知道的不同数量的文件,因此我想利用它并执行类似的操作

rule unpack:
    input: '{id}.archive'
    output: 
        lambda wildcards: ARCHIVE_CONTENTS[wildcards.id]
Run Code Online (Sandbox Code Playgroud)

但是我无法使用函数output,并且有充分的理由.但是,我无法想出一个好的替代品.该规则运行起来非常昂贵,所以我不能这样做

rule unpack:
    input: '{id}.archive'
    output: '{id}/{outfile}'
Run Code Online (Sandbox Code Playgroud)

并为每个存档运行多次规则.另一种选择可能是

rule unpack:
    input: '{id}.archive'
    output: '{id}/{outfile}'
    run:
        if os.path.isfile(output[0]):
            return
        ...
Run Code Online (Sandbox Code Playgroud)

但我担心会引入竞争条件.

是否dynamic真的唯一选择标记规则输出?我可以自动为每个存档生成一个单独的规则,但我还没有找到办法.

Joh*_*ter 5

在这里,Snakemake是纯Python的扩展变得很方便.您可以为每个存档生成单独的规则:

for id, contents in ARCHIVE_CONTENTS.items():
    rule:
        input: 
            '{id}.tar.gz'.format(id=id)
        output: 
            expand('{id}/{outfile}', outfile=contents)
        shell:
            'tar -C {wildcards.id} -xf {input}'
Run Code Online (Sandbox Code Playgroud)

根据这种存档的类型,您还可以使用单个规则来提取所需的文件,例如:

rule unpack:
    input:
        '{id}.tar.gz'
    output:
        '{id}/{outfile}'
    shell:
        'tar -C {wildcards.id} -xf {input} {wildcards.outfile}'
Run Code Online (Sandbox Code Playgroud)