我是SnakeMake的新手。我正在尝试通过这个简单的Snakefile自己教它:
(IDS, ) = glob_wildcards( "{id}.txt" )
print ( str ( IDS ) )
rule all:
input:
expand ( "out/{id}-1.txt", id = IDS )
rule copy:
input:
"{id}.txt"
output:
"out/{id}-1.txt"
shell:
"cp {input} {output}"
我第一次运行它(当尚不存在时),它运行良好并创建了三个副本。下次,IDS包含'out/c-1', 'out/a-1', 'out/b-1'
,这当然不是我想要的,因为我希望glob_wildcards仅扫描第一级。有什么方法可以做到,也许用函数接收到的regex参数?
到目前为止,在创建IDS之后,我仅通过过滤器对其进行管理:
IDS = [ id for id in IDS if '/' not in id ]
但是我希望有更紧凑的东西。
根据我在glob_wildcards
实现中看到的内容,此函数没有任何限制级别的参数。这意味着您的解决方案(1行代码)可能是最紧凑的解决方案,以防您确实需要将输出文件夹作为输入的嵌套文件夹。
简单的解决方案是将输入和输出分离到同级文件夹中。在这种情况下,以下代码将在一个干净的输入文件夹中搜索,该文件夹永远不会污染输出:
(IDS, ) = glob_wildcards( "path_to_input/{id}.txt" )
我同意单独的目录是解决此问题的最简单方法。您也可以使用wildcard constraints告诉snakemake您的ID不包含'/'
:
(IDS, ) = glob_wildcards("{id,[^/]+}.txt")