uv 不提供环境备份操作,而是用 uv lock 生成跨平台可重现的依赖快照(含版本、校验和、Python 约束),再通过 uv sync 按需重建虚拟环境;直接复制 .venv 因硬链接、路径嵌入和 pyvenv.cfg 写死路径导致迁移失败。

uv 本身不提供“环境备份”这个语义的操作,它用 uv lock + uv sync 的组合替代传统备份思路——不是拷贝整个 .venv 目录,而是锁定依赖快照、再按需重建。直接复制 .venv 文件夹不仅体积大、跨平台失效,还会因硬链接/路径嵌入导致激活失败。
为什么不能直接 cp .venv 备份?
uv 创建的虚拟环境默认使用硬链接共享全局缓存包,.venv 里实际只存符号链接和少量元数据。直接复制会导致:
-
.venv内部路径仍指向原机缓存目录(如/Users/xxx/Library/Caches/uv),换机器就报错ModuleNotFoundError - Windows 上硬链接不可靠,复制后变成独立副本,体积暴涨数倍
-
pyvenv.cfg中的home =路径写死原始 Python 解释器位置,迁移后uv run可能找不到解释器
正确做法:用 uv lock 生成可重现的依赖快照
在项目根目录执行:
uv lock
这会生成一个 uv.lock 文件,它精确记录:
立即学习“Python免费学习笔记(深入)”;
- 每个依赖的版本、wheel URL、SHA256 校验和
- Python 版本约束(来自
pyproject.toml或.python-version) - 所有传递依赖,不含任何本地路径或环境变量信息
这个文件可提交到 Git,是真正可跨平台、可审计、可重现的“备份”。
恢复时只需:
uv sync
uv 会自动:
- 检查
.python-version或pyproject.toml中的 Python 要求,必要时调用uv python install - 从
uv.lock下载 wheel 并安装,全程不碰系统 pip 缓存 - 创建干净的
.venv,不残留旧环境痕迹
如何让 lock 文件包含 dev 依赖和 extras?
默认 uv lock 只锁主依赖。若项目有测试、格式化等开发依赖,或用了 requests[security] 这类 extras,必须显式声明:
- 加
--dev:锁定[project.optional-dependencies.dev]和主依赖 - 加
--extra security:锁定requests[security]及其传递依赖 - 组合使用:
uv lock --dev --extra security
否则 uv sync 恢复出来的环境会缺失 pytest、ruff 等工具,CI 构建直接失败。
备份 Python 解释器本身:用 uv python pin + uv python install
仅备份依赖不够——如果目标机器没装对应 Python 版本,uv sync 会卡在 “No Python 3.x found”。所以完整备份需两步:
- 运行
uv python pin 3.12:生成.python-version,记录项目所需解释器版本 - 在 CI 或新机器上,先执行
uv python install 3.12,再跑uv sync
注意:uv python install 下载的是官方预编译二进制,不依赖系统 OpenSSL 或 libffi,比 pyenv 安装更稳定。但首次下载需网络,离线场景需提前 uv python install --no-cache 配合本地镜像。
真正需要备份的只有三个轻量文件:pyproject.toml、uv.lock、.python-version。它们加起来不到 10KB,却能保证任意机器上 uv sync 出来完全一致的环境——这才是 uv 对“备份”这件事的重新定义。


















