
本文介绍如何在 dvc 项目中使用 python 常量文件(如 `constants.py`)集中定义数据路径,并在 `dvc.yaml` 中通过 `vars` 引入实现跨阶段复用,避免硬编码和路径重复。
DVC 支持通过 vars 机制从外部 Python 文件加载变量,这是管理全局路径(如数据输入 deps、模型输出 outs)的理想方式。你提供的配置基本正确,只需确保几点关键细节即可稳定生效:
✅ 正确写法示例
首先,确保 constants.py 是标准的 Python 模块(无执行逻辑,仅变量赋值):
# constants.py MY_DATA = "data/location" MY_OUT = "data/out"
然后在 dvc.yaml 中声明 vars 并引用变量(注意:DVC v3.0+ 要求 vars 必须为列表,且路径为相对于 dvc.yaml 的相对路径):
# dvc.yaml
vars:
- constants.py # ✅ 正确:加载同目录下的 constants.py
stages:
preprocess:
deps:
- ${MY_DATA} # → 解析为 "data/location"
outs:
- ${MY_OUT} # → 解析为 "data/out"
cmd: python preprocess.py⚠️ 常见问题排查
- 路径错误:若 constants.py 不在 dvc.yaml 同级目录,请使用相对路径,例如 - ../config/constants.py;
- 变量命名冲突:避免与 DVC 内置变量(如 stage, params)同名;
- 语法格式:vars 必须是 YAML 列表(带 -),不可写作 vars: constants.py(这会报错);
- DVC 版本:该特性自 DVC v2.30.0 起稳定支持,建议升级至最新版:pip install --upgrade dvc。
? 替代方案说明
虽然 params.yaml 也可存储路径,但它主要用于可追踪、可实验对比的参数(如超参、阈值),而路径类常量属于基础设施配置,更适合用 vars + Python 文件管理——语义更清晰、类型更自由(支持动态拼接、条件路径等):
# constants.py(进阶用法) import os BASE_DIR = "data" MY_DATA = os.path.join(BASE_DIR, "raw") MY_OUT = os.path.join(BASE_DIR, "processed", "v1")
✅ 最后,运行 dvc repro 或 dvc dag 验证变量是否成功解析。若仍报错(如 undefined variable 'MY_DATA'),请检查文件权限、Python 语法错误,或提交 issue 至 DVC GitHub 获取官方支持。










