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

Snakemake问题:如何基于前序规则输出动态变更规则输入?

问题根源
  1. 静态expand的局限性:Snakemake初始化阶段就会计算expand的结果,但此时success.csv还未生成(它是download规则的运行时产物),导致list_of_wildcards为空,extract_results的输入被判定为已满足,直接跳过calculate_something。
  2. 依赖链断裂: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:16:30