无网络时Snakemake远程提供者致DAG构建失败的解决办法
解决Snakemake无网络环境下使用已缓存HTTP远程文件的问题
在无网络的HPC集群上,即便本地已存在所有需要的远程文件,Snakemake仍会在DAG构建阶段尝试访问网络解析HTTP远程输入,导致工作流失败。以下是几种可行的解决方案:
1. 使用--skip-remote-checks命令行参数
Snakemake内置的--skip-remote-checks选项会跳过所有远程文件的存在性、校验和检查,直接使用本地已有的文件。无需修改Snakefile,在无网环境运行时添加该参数即可:
snakemake --skip-remote-checks
2. 条件化输入源,优先使用本地文件
修改规则的输入定义,通过Python条件判断优先加载已存在的本地文件,仅当本地文件缺失时才调用远程提供者。需导入os模块:
import os from shutil import copyfile, move from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider HTTP = HTTPRemoteProvider() rule retrieve_cost_data: input: lambda wildcards: ( HTTP.remote( "raw.githubusercontent.com/PyPSA/technology-data/v0.5.0/outputs/costs_{year}.csv", keep_local=True, ) if not os.path.exists(f"data/costs_{wildcards.year}.csv") else f"data/costs_{wildcards.year}.csv" ), output: "data/costs_{year}.csv", run: # 仅当输入为远程文件时执行移动操作 if input[0] != output[0]: move(input[0], output[0]) rule use_cost_data: input: "data/costs_2030.csv" output: "resources/costs.csv" default_target: True run: copyfile(input[0], output[0])
这种方式会在DAG构建阶段自动判断本地文件状态,避免无网时触发网络请求。
3. 通过环境变量控制远程提供者加载
在Snakefile中根据环境变量决定是否导入HTTP远程提供者,完全跳过远程输入的解析逻辑:
import os from shutil import copyfile, move # 环境变量SNAKEMAKE_USE_LOCAL设为1时启用本地模式 USE_LOCAL = os.environ.get("SNAKEMAKE_USE_LOCAL", "0") == "1" # 仅在非本地模式下导入远程提供者 if not USE_LOCAL: from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider HTTP = HTTPRemoteProvider() rule retrieve_cost_data: input: HTTP.remote( "raw.githubusercontent.com/PyPSA/technology-data/v0.5.0/outputs/costs_{year}.csv", keep_local=True, ) if not USE_LOCAL else f"data/costs_{wildcards.year}.csv", output: "data/costs_{year}.csv", run: if not USE_LOCAL: move(input[0], output[0]) rule use_cost_data: input: "data/costs_2030.csv" output: "resources/costs.csv" default_target: True run: copyfile(input[0], output[0])
无网环境下运行时,先设置环境变量再启动工作流:
export SNAKEMAKE_USE_LOCAL=1 snakemake
内容的提问来源于stack exchange,提问作者euronion
相关产品推荐
相关产品推荐

