能否在同一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
相关产品推荐
相关产品推荐

