Snakemake中如何实现含通配符的字符串变量在expand函数内的正确展开?
Snakemake中如何实现含通配符的字符串变量在expand函数内的正确展开?
嗨,我完全懂你的烦恼!这种重复的超长字符串写起来又麻烦又容易出错,想把它抽成变量简化代码太合理了~你遇到的报错是因为Snakemake的expand()函数把你写的{prefix}当成了一个新的需要赋值的通配符,而不是你定义的那个变量里的内容。不过有两个简单的办法能解决这个问题:
方法一:用Python f-string提前拼接路径模板
先把你的prefix变量代入到完整的路径字符串里,再把这个拼接好的模板传给expand(),这样Snakemake就能正确识别里面的ngen、N这些真正的通配符了:
prefix = "test_nGen{ngen}_N{N}_S{S}_NR{NR}_DG{DG}_SS{SS}" # 用f-string把prefix插入到路径模板中 full_template = f"sim_files/{prefix}/{prefix}.yaml" rule all: input: expand(full_template, ngen=list_ngen, N=list_N, S=list_S, NR=list_NR, DG=list_DG, SS=list_SS)
方法二:直接用字符串拼接
如果你不习惯f-string,也可以用基础的字符串加法来拼接模板,效果是一样的:
prefix = "test_nGen{ngen}_N{N}_S{S}_NR{NR}_DG{DG}_SS{SS}" full_template = "sim_files/" + prefix + "/" + prefix + ".yaml" rule all: input: expand(full_template, ngen=list_ngen, N=list_N, S=list_S, NR=list_NR, DG=list_DG, SS=list_SS)
原理说明
这两种方法的核心都是先让Python处理你的prefix变量,把它的内容合并到路径模板里,等传给expand()的时候,它看到的是包含{ngen}、{N}这些目标通配符的完整字符串,而不是带有{prefix}的“嵌套通配符”,自然就不会报错啦~
备注:内容来源于stack exchange,提问作者Kiffikiffe
相关产品推荐
相关产品推荐

