如何实现自动从/dvs_ro读取输入的Snakemake存储插件
解决Snakemake区分输入/输出以适配NERSC只读挂载的方案
方案1:直接利用路径替换结合输入输出标记
Snakemake天然区分输入与输出文件,无需复杂插件就能实现路径适配:
- 对规则中
input字段的所有路径,将/global替换为/dvs_ro;output字段保持/global路径不变。 - 示例代码:
def adapt_input_path(path): return path.replace("/global", "/dvs_ro") rule process_data: input: adapt_input_path("/global/dataset/raw_data.csv") output: "/global/processed/clean_data.csv" shell: "python process.py {input} {output}"
方案2:自定义存储插件中通过is_output参数判断
如果坚持使用存储插件,可借助Snakemake传递的is_output参数区分文件类型:
- 插件的
get_file方法会接收is_output布尔值,据此选择对应挂载路径: - 核心代码示例:
class NERSCStorage(StorageInterface): def get_file(self, path, is_output=False): if is_output: return f"/global{path}" else: return f"/dvs_ro{path}" - 注册插件后,Snakemake会自动为输入、输出文件分配对应路径。
方案3:配置文件+通配符批量管理路径
针对大规模工作流,可在配置文件中定义路径规则,结合通配符批量适配:
- 配置文件(config.yaml):
nersc_paths: input_root: "/dvs_ro" output_root: "/global" - 规则中调用示例:
rule batch_process: input: expand("{input_root}/samples/{sample}.fastq", input_root=config["nersc_paths"]["input_root"], sample=["S1", "S2", "S3"]) output: expand("{output_root}/alignments/{sample}.bam", output_root=config["nersc_paths"]["output_root"], sample=["S1", "S2", "S3"]) shell: "aligner {input} -o {output}"
内容的提问来源于stack exchange,提问作者gipert
相关产品推荐
相关产品推荐

