我有一个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真的唯一选择标记规则输出?我可以自动为每个存档生成一个单独的规则,但我还没有找到办法.
在这里,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)
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |