我是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}"我第一次运行它时(当out还不存在时),它运行得很好,并创建了三个in out副本。下一次,IDS包含'out/c-1', 'out/a-1', 'out/b-1',这当然不是我想要的,因为我希望glob_wildcards只扫描第一级。有没有办法做到这一点,也许是使用函数接收的regex参数?
到目前为止,在IDS创建之后,我只通过一个过滤器来管理它:
IDS = [ id for id in IDS if '/' not in id ]但我希望是更紧凑的。
发布于 2020-03-18 14:30:31
从我在glob_wildcards实现中看到的情况来看,这个函数没有任何限制级别的参数。这意味着您的解决方案(一行代码)可能是最紧凑的解决方案,以防您确实需要输出文件夹作为输入的嵌套文件夹。
简单的解决方案是将输入和输出分离到同级文件夹中。在这种情况下,下面的代码将在一个干净的输入文件夹中进行搜索,该文件夹从未被输出污染:
(IDS, ) = glob_wildcards( "path_to_input/{id}.txt" )发布于 2020-03-19 00:51:23
我同意单独的目录是解决这个问题的最简单的方法。您还可以使用wildcard constraints告诉snakemake您的ids不包含'/'
(IDS, ) = glob_wildcards("{id,[^/]+}.txt")https://stackoverflow.com/questions/60731232
复制相似问题