You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake独立工作流作为模块导入时执行失败问题求助

解决Snakemake模块导入时的AttributeError错误

问题场景

有两个可独立运行的Snakemake工作流:

  • 第一个从配置文件读取输入,生成.csv输出文件
  • 第二个以该.csv文件作为输入
    尝试通过模块导入方式将二者合并到第三个Snakefile,执行snakemake --cores 1 -n时触发错误,使用Snakemake版本8.6,目录结构为combined_pipelines下包含metadata、download、run_pipe(合并工作流目录)三个子目录。

合并用Snakefile代码

from snakemake.utils import min_version
min_version("6.0")


module metadata:
    snakefile:
        "../../metadata/workflow/metadata.smk"
    replace_prefix: '../../metadata'
    config:
        'config/metadata.yaml'

use rule * from metadata as metadata_*

module download:
    snakefile:
        "../../download/workflow/downloads.smk"
    replace_prefix: "../../download"
    config:
        'config/download.yaml'

use rule * from download as download_*

rule all:
    input:
        rules.metadata_all.input,
        rules.download_all.input
    default_target: True

报错信息

Traceback (most recent call last):
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/cli.py", line 1961, in args_to_api
    dag_api = workflow_api.dag(
              ^^^^^^^^^^^^^^^^^
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/api.py", line 328, in dag
    return DAGApi(
           ^^^^^^^
  File "<string>", line 6, in __init__
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/api.py", line 438, in __post_init__
    self.workflow_api._workflow.dag_settings = self.dag_settings
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/api.py", line 385, in _workflow
    workflow.include(
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/workflow.py", line 1391, in include
    exec(compile(code, snakefile.get_path_or_uri(), "exec"), self.globals)
  File "/home/bayraktar/PycharmProjects/combined_pipelines/run_pipe/workflow/Snakefile", line 16, in <module>
    "../../download/workflow/downloads.smk"
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/workflow.py", line 2130, in decorate
    module.use_rules(
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/modules.py", line 82, in use_rules
    modifier = WorkflowModifier(
               ^^^^^^^^^^^^^^^^^
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/modules.py", line 207, in __init__
    self.path_modifier = PathModifier(replace_prefix, prefix, workflow)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bayraktar/miniforge3/envs/snakemakefull/lib/python3.12/site-packages/snakemake/path_modifier.py", line 32, in __init__
    for prefix, replacement in replace_prefix.items():
                               ^^^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'items'

错误原因

Snakemake 8.x版本中,replace_prefix参数要求为字典格式(键值对,用于映射模块内的路径前缀到当前工作流的对应路径),但代码中传入的是字符串,导致程序尝试调用字符串的items()方法时触发AttributeError。

修复方案

将两个模块的replace_prefix修改为字典格式,键为模块内部使用的基础路径前缀(通常为.,即模块Snakefile所在目录的相对路径根),值为模块根目录相对于当前合并Snakefile的路径:

修正后的Snakefile代码

from snakemake.utils import min_version
min_version("6.0")


module metadata:
    snakefile:
        "../../metadata/workflow/metadata.smk"
    replace_prefix: {".": "../../metadata"}
    config:
        'config/metadata.yaml'

use rule * from metadata as metadata_*

module download:
    snakefile:
        "../../download/workflow/downloads.smk"
    replace_prefix: {".": "../../download"}
    config:
        'config/download.yaml'

use rule * from download as download_*

rule all:
    input:
        rules.metadata_all.input,
        rules.download_all.input
    default_target: True

补充说明

如果原工作流中使用了特定的路径前缀(比如../data),只需将字典的键替换为该前缀,值替换为当前合并工作流中对应的绝对/相对路径即可。

内容的提问来源于stack exchange,提问作者eggrep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:10:29