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

能否在同一Snakemake流程中混用目录与文件作为规则输入?

问题

我正在用Python脚本构建Snakemake流程,部分脚本需要传入目录作为输入,另一部分则需要传入目录内的文件作为输入。我想让流程里同时存在接收目录和接收文件的规则,请问这可行吗?以下是我写的示例代码:

FILES = glob.glob("data/*/*raw.csv")
FOLDERS = glob.glob("data/*/")

rule targets:
  input:
    processed_csv = expand("{files}raw_processed.csv", files =FILES),
    normalised_csv = expand("{folders}/normalised.csv", folders=FOLDERS)

rule process_raw_csv:
  input: 
    script = "process.py",
    csv = "{sample}raw.csv"
  output:
    processed_csv = "{sample}raw_processed.csv"
  shell:
  "python {input.script} -i {input.csv} -o {output.processed_csv}"

rule normalise_processed_csv:
  input:
    script = "normalise.py",
    processed_csv = "{sample}raw_processed.csv" # 这个输入不会被脚本解析,而是在normalise.py内部获取
    
  params:
    folder = "{folders}"
  
  output:
    normalised_csv = "{folders}/normalised.csv" # 输出文件
  
  shell:
  "python {input.script} -i {params.folder}"

部分脚本(比如process.py)需要明确传入指定文件,而另一些脚本(比如normalise.py)只需要传入主目录,文件会在脚本内部获取并输出到该目录。我考虑过改写所有Python脚本让它们统一接收目录作为输入,但希望找到不用改写全部脚本的方案。

我已经查阅过类似问题,但和本次情况不完全一致。


解决方案

完全可行,Snakemake支持同时处理文件和目录作为输入的规则,核心是要正确关联规则间的依赖关系,避免通配符匹配冲突。

原代码存在的问题

  • normalise_processed_csv规则中,{sample}和{folders}两个通配符无明确关联,Snakemake无法正确推断依赖关系
  • targets规则的expand逻辑错误:FILES是具体文件路径(如data/sample1/file_raw.csv),expand后会生成data/sample1/file_raw.csvraw_processed.csv这类无效路径

修改后的可行代码

import glob

# 获取所有样本目录,去除末尾斜杠统一格式
FOLDERS = [f.rstrip('/') for f in glob.glob("data/*/")]
# 基于目录生成对应的raw文件匹配路径
FILES = [f"{folder}/*raw.csv" for folder in FOLDERS]

rule all:
    input:
        # 每个目录对应一个处理后的csv
        expand("{folder}/raw_processed.csv", folder=FOLDERS),
        # 每个目录对应一个归一化后的csv
        expand("{folder}/normalised.csv", folder=FOLDERS)

rule process_raw_csv:
    input:
        script = "process.py",
        csv = "{folder}/*raw.csv"
    output:
        processed_csv = "{folder}/raw_processed.csv"
    shell:
        """
        python {input.script} -i {input.csv} -o {output.processed_csv}
        """

rule normalise_processed_csv:
    input:
        script = "normalise.py",
        # 明确依赖对应目录下的处理后文件,保证执行顺序
        processed_csv = "{folder}/raw_processed.csv"
    output:
        normalised_csv = "{folder}/normalised.csv"
    shell:
        """
        python {input.script} -i {wildcards.folder}
        """

关键调整说明

  • 统一使用{folder}作为核心通配符,关联目录与下属文件的归属,让Snakemake能清晰推断每个目录对应的依赖链
  • 修正路径生成逻辑,避免无效文件路径
  • normalise_processed_csv规则直接通过wildcards.folder获取目录路径,无需额外params,同时明确依赖该目录下的处理后文件,确保流程按顺序执行
  • 若单个目录下存在多个raw.csv文件,可在process_raw_csv规则中扩展输入逻辑(如用expand处理多文件),或修改process.py支持批量读取目录内的raw文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:45:45