Snakemake问题:如何基于前序规则输出动态变更规则输入?
问题根源
- 静态
expand的局限性:Snakemake初始化阶段就会计算expand的结果,但此时success.csv还未生成(它是download规则的运行时产物),导致list_of_wildcards为空,extract_results的输入被判定为已满足,直接跳过calculate_something。 - 依赖链断裂:
download规则仅声明了success.csv作为输出,但实际还生成了image.png文件,Snakemake无法将calculate_something的输入与download规则关联起来。
解决方案:用Checkpoint处理动态依赖
Snakemake的checkpoint机制专门解决运行时才确定的文件依赖问题,替代旧版的dynamic。以下是修改后的完整工作流:
1. 新增Checkpoint解析success.csv
创建一个checkpoint规则,读取success.csv并生成包含所有成功下载wildcard的文件:
checkpoint parse_success_list: input: "base-path/success.csv" output: wildcards_file="base-path/success_wildcards.txt" script: "scripts/parse_success.py"
对应的parse_success.py脚本示例(假设success.csv中image_id列为wildcard名称):
import pandas as pd df = pd.read_csv(snakemake.input[0]) wildcards = df["image_id"].tolist() with open(snakemake.output.wildcards_file, "w") as f: f.write("\n".join(wildcards))
2. 动态生成extract_results的依赖
修改extract_results规则,通过函数动态读取checkpoint生成的wildcard列表,构建对some-measurement.json的依赖:
def get_measurement_files(wildcards): # 读取checkpoint输出的wildcard列表 with open(checkpoint_output("parse_success_list")["wildcards_file"]) as f: wildcard_list = [line.strip() for line in f if line.strip()] # 返回所有对应的测量文件路径 return expand("base-path/images/{wc}/some-measurement.json", wc=wildcard_list) rule extract_results: input: measurement_files=get_measurement_files output: "base-path/result.csv" params: x="some-param" threads: 8 script: "scripts/extract.py"
3. 关联download与calculate_something的依赖
修改download规则,声明images目录为其产物,让Snakemake明确该目录下的image.png由download生成:
rule download: input: df_path="base-path/dataframe.csv" params: x="abcd", y=False, z="pqrs" output: success_csv="base-path/success.csv", images_dir=directory("base-path/images") threads: 12 script: "scripts/download.py"
4. 修正rule all
确保总入口规则包含所有最终产物:
rule all: input: "base-path/success.csv", "base-path/result.csv"
关键说明
- Checkpoint会在
download规则完成后执行,解析success.csv生成动态wildcard列表,后续规则基于这个列表构建完整依赖链。 - 避免使用静态
expand:静态expand在初始化阶段计算,无法获取运行时生成的wildcard数据。 - 目录声明:用
directory()标记images目录为download的输出,确保Snakemake知道该目录下的文件需要由download规则生成。
内容的提问来源于stack exchange,提问作者Vicky Parmar
相关产品推荐
相关产品推荐

