我正在构建一个蛇形管道。我有一个config.yaml文件,我想在其中存储通配符约束。假设我在配置文件中有这个块:
wildcard_constraints:
sample: '[^_/]+'
reference: '[^/]+'
然后在我的蛇形文件中,我有:
configfile: 'config/config.yaml'
print(config['wildcard_constraints']) # for debugging
wildcard_constraints: config['wildcard_constraints']
rule test:
output:
touch("{sample}.test")
这会产生以下内容:
{'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中获得了我的通配符约束字典。但它并没有将其用作通配符约束字典,而是尝试对其进行解析。
我该怎么绕过这个?
如果我只是在snake文件中包含以下内容,而不是试图从config.yaml中获取约束,那么就没有错误。因此,这就足够了,但如果能够分离出约束条件,那就太好了。
wildcard_constraints:
sample = '[^_/]+',
reference = '[^/]+'
您可以通过修改workflow._wildcard_constraints
dict来动态执行此操作。例如,以下操作(在Snakemake5.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
上工作。至少,请注意,您不能保证它在各个版本中都是稳定的。