You need to enable JavaScript to run this app. Snakemake批量复制文件至多目录并sed替换时报sample未定义错误
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 20:15:02