Snakemake工作流独立运行正常,但作为模块导入时失败

1 投票
1 回答
34 浏览
提问于 2025-04-14 16:02

我有两个可以正常工作的流程。第一个流程从一个配置文件中获取输入,然后生成一个 .csv 输出文件。第二个流程则使用第一个流程生成的 .csv 文件作为输入。当我单独运行这两个流程时,它们都能正常工作。我想把这两个流程结合起来,在一个第三个 Snakefile 中导入它们作为模块。但是这个 Snakefile 报错了,我搞不清楚哪里出了问题。

我的 snakemake 版本是 8.6。

目录结构如下:

  • combined_pipelines
    • 流程 1
    • 流程 2
    • 组合流程

下面是我在导入这两个正常工作的流程时,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

这是我运行 snakemake --cores 1 -n 时收到的错误信息:

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'

1 个回答

0

这个错误信息很清楚地说明了问题:replace_prefix应该是一个字典,而不是一个字符串。要进行替换,你需要明确地告诉程序你要替换什么,以及要替换成什么。所以它应该是这样的:

replace_prefix: {'../../metadata' : 'absolute_path_to_metadata'}

撰写回答