Snakemake批量复制文件至多目录并sed替换时报sample未定义错误
Snakemake 通配符引用导致NameError的解决方法
报错触发原因
Snakemake规则的shell执行块中,你在输出路径里定义的{sample}是路径通配符,这类通配符不能在shell块里直接作为普通变量用{sample}的格式访问——Snakemake解析时会把大括号包裹的内容当做上下文可访问的Python变量查找,因为当前上下文没有名为sample的顶层变量,才会触发提示“Did you mean 'wildcards.sample'?”的NameError。
需同步修正的其他代码问题
只把{sample}替换为{wildcards.sample}不足以让代码正常运行,原代码还有几处问题需要修正:
- 全局变量拼写不统一:定义的样本列表是
SAMPLE,但rule all的expand中引用的是SAMPLES,会触发未定义变量报错 - sed命令缺少原地修改能力:原sed命令只会把替换后的内容打印到控制台,不会实际修改目标文件,需要添加
-i参数实现原地替换 - shell块内硬编码路径和实际输出不匹配:原shell里写的是相对路径
folder_{sample}/myfile.sh,但实际输出路径是workdir/folder_{sample}/myfile.sh,硬写路径容易触发文件找不到的错误,直接复用规则已定义的输出变量值即可避免这类问题
修正后的完整可运行代码
# 统一变量命名,保证和后续引用一致 SAMPLES = ["1234", "4321"] rule all: input: expand("workdir/folder_{sample}/myfile.sh", sample=SAMPLES) rule copy: input: copy_from="/path/to/folder_1234/myfile.sh" output: copy_to="workdir/folder_{sample}/myfile.sh" shell: # 通配符通过wildcards对象访问,路径直接引用已定义的output变量,sed增加-i参数实现原地替换 """ cp {input.copy_from} {output.copy_to} sed -i "s/folder_1234/folder_{wildcards.sample}/g" {output.copy_to} """
内容的提问来源于stack exchange,提问作者user3224522
相关产品推荐
相关产品推荐

