我正在构建一个蛇形管道。我有一个config.yaml文件,我想在其中存储通配符约束。说我在配置文件中有这个块:
wildcard_constraints:
sample: '[^_/]+'
reference: '[^/]+'
然后在我的蛇文件中,我有:
configfile: 'config/config.yaml'
print(config['wildcard_constraints']) # for debugging
wildcard_constraints: config['wildcard_constraints']
这将产生以下内容:
{'sample': '[^_/]+', 'reference': '[^/]+'}
TypeError in line 32 of /myfolder/snakefile:
global_wildcard_constraints() takes 1 positional argument but 2 were given
File "/myfolder/snakefile", line 32, in <module>
因此,snakemake从config.yaml中获取我的wildcard_constraints字典就很好了。但是,它不仅试图将其用作通配符约束字典,还试图对其进行解析。
我该如何解决?
如果仅在蛇文件中包含以下内容,而不是尝试从config.yaml获取约束,则不会出现错误。这样就足够了,但是能够分离出约束是很好的。
wildcard_constraints:
sample = '[^_/]+',
reference = '[^/]+'
您可以通过修改workflow._wildcard_constraints
字典来动态地执行此操作。例如,以下作品(在Snakemake 5.11.2
上):
configfile: "config.yaml"
for wildcard, constraint in config["wildcard_constraints"].items():
workflow._wildcard_constraints[wildcard] = constraint
print(workflow._wildcard_constraints) # For debugging
rule test:
output:
touch("{sample}.test")
并打印{'reference': '[^/]+', 'sample': '[^_/]+'}
。我还确认了规则test
可以创建例如example.test
,但不是_example.test
。
但是,由于它可以在“专用” _wildcard_constraints
上运行,因此可能有点hack。至少要知道,您不能保证在各个版本中这都是稳定的。