Snakemake如何基于前置规则生成的CSV参数批量运行Papermill
解决Snakemake动态参数组合+Papermill批量跑Notebook的问题
核心思路
Snakemake默认要求初始化时就得明确所有目标,但你这种先生成CSV再提取参数的动态场景,得用checkpoint来破局——先跑完生成CSV的前置步骤,再基于结果动态生成后续要执行的Notebook目标,完美绕开初始化阶段不知道参数列表的限制。
步骤1:写生成参数CSV的基础规则
先把生成params.csv的规则搭好,替换成你实际生成CSV的命令就行:
rule generate_params_csv: output: "params.csv" shell: """ # 这里换成你生成CSV的真实逻辑,比如从数据库拉取、脚本生成等 echo "number,word" > {output} echo "1,apple" >> {output} echo "2,banana" >> {output} echo "1,apple" >> {output} # 故意加重复行测试去重效果 echo "3,apple" >> {output} """
步骤2:用Checkpoint提取去重参数组合
搞个checkpoint读取生成好的CSV,提取去重的numbers和words列表,再生成所有参数组合对应的Notebook输出路径,把这些路径写到临时文件里:
checkpoint extract_params: input: "params.csv" output: temp("param_combinations.txt") # temp标记会让Snakemake自动清理这个临时文件 script: "extract_params.py"
对应的extract_params.py脚本实现:
import pandas as pd from itertools import product # 读取生成的CSV文件 df = pd.read_csv(snakemake.input[0]) # 提取去重后的参数列表 numbers = df["number"].unique().tolist() words = df["word"].unique().tolist() # 生成所有参数组合 combinations = list(product(numbers, words)) # 为每个组合生成对应的Notebook输出路径,格式可自定义 output_paths = [f"notebooks/output_{num}_{word}.ipynb" for num, word in combinations] # 将路径写入临时文件,供后续规则读取 with open(snakemake.output[0], "w") as f: f.write("\n".join(output_paths))
步骤3:让all规则动态获取目标
写个函数读取checkpoint生成的临时文件,把所有要运行的Notebook路径提取出来,这样all规则就能动态引用这些目标:
def get_notebook_targets(wildcards): with open(checkpoint.extract_params.output[0]) as f: return [line.strip() for line in f if line.strip()] rule all: input: get_notebook_targets
步骤4:写Papermill批量运行Notebook的规则
最后写个规则,用通配符匹配每个参数组合,调用Papermill执行模板Notebook:
rule run_notebook: input: template="notebooks/template.ipynb", # 你的Jupyter Notebook模板文件 params_csv="params.csv" # 依赖CSV文件,确保生成后再执行Notebook output: "notebooks/output_{number}_{word}.ipynb" params: number="{number}", word="{word}" shell: """ papermill {input.template} {output} -p number {params.number} -p word {params.word} """
关键细节说明
- Checkpoint的作用:绕过Snakemake初始化阶段必须明确所有目标的限制,先执行参数生成步骤,再将结果反馈给工作流,动态生成后续任务。
- 去重逻辑:借助
pandas的unique()方法直接提取去重后的参数列表,简单高效。 - 通配符匹配:
run_notebook规则中的{number}和{word}会自动对应输出路径中的内容,Snakemake会自动将每个参数组合映射为独立的运行任务。
运行测试
直接执行snakemake --cores 4(cores数根据你的机器配置调整),工作流会按以下顺序执行:
- 运行
generate_params_csv生成params.csv - 执行checkpoint
extract_params提取参数组合并生成目标路径列表 - 动态更新
all规则的输入,为每个参数组合运行run_notebook
内容的提问来源于stack exchange,提问作者Michele Peresano
相关产品推荐
相关产品推荐

