Snakemake使用checkpoint无需建文件夹 提取表头作为rule all通配符方案
解决方案
核心思路是使用Snakemake原生的checkpoint机制处理「上游规则输出动态决定下游通配符取值」的场景,全程不会生成额外文件夹,完全符合需求。
完整修改后代码
import pandas as pd # 将生成fruit_file.csv的规则标记为checkpoint,标识其输出会影响后续通配符解析 checkpoint create_file: output: fruit = 'fruit_file.csv' run: # 此处保留你原本生成fruit_file.csv的逻辑 pass # 定义解析函数:checkpoint执行完成后读取表头,返回可用的fruit取值列表 def get_fruit_names(wildcards): ck_output = checkpoints.create_file.get().output.fruit df = pd.read_csv(ck_output, sep='\t', header=0) return df.columns.tolist()[2:] rule all: input: final_report = expand('report_{fruit}.txt', fruit=get_fruit_names) # 调整next规则,每个fruit对应一个独立的输出实例,由Snakemake自动匹配调度 rule next: input: fruit = 'fruit_file.csv' output: report = 'report_{fruit}.txt' run: # 可通过wildcards.fruit直接获取当前任务对应的水果名,执行你的生成逻辑 shell(f"touch {output.report}")
方案说明
- 不会生成额外文件夹的原因:官方示例出现文件夹是因为示例将通配符放在了目录层级(如
{sample}/output.txt),本方案中通配符仅出现在文件名部分,全程没有新增目录的逻辑,自然不会产生多余文件夹。 - 该方案完全遵循Snakemake的调度逻辑,支持并行执行、断点重跑,适配你提到的100-200个通配符取值的场景不会有额外性能开销。
内容的提问来源于stack exchange,提问作者Rikke Jacobsen
相关产品推荐
相关产品推荐

