uv:终结 Python 虚拟环境管理乱局
摘要若你仍在这般流程中反复折腾, 即 -m venv .venv , 随即 .venv/bin/ , 接着 pip -r .txt , 那便到了审视 uv 的时候。uv 乃是由 Ruff、ty 的作者运用 Rust 所编写的 包与项目管理工具, 它将版本管理、依赖安装、锁文件、虚拟环境、项目管理这五项事宜整合于一个单文件二进制之中, 其安装速度为 pip 的 10 至 100 倍, 并且全然无需手动激活环境。uv 是什么一句话概括可得: uv等于pyenv也就是版本管理, 加上pip也就是包安装, 再加上pip-tools也就是锁文件, 再加上venv也就是虚拟环境, 还加上/pdm也就是项目管理。它并非是又一个“步伐更为迅速的 pip”, 而是将生态之中长久以来处于分裂状态的这几层工具, 统一到了一个工具链条里面:关于版本管理, uv 3.12 可直接下载对应其版本的解释器, 而无需再单独去安装 pyenv。虚构的环境, 使用 uv venv , 或者干脆不要通过手动去创建, uv run 能够自动进行检测, 或者创建项目的名为 .venv 的环境。依赖的安装以及锁定方面, uv add 或者 uv sync 会生成并且使用 uv.lock, 以此确保团队成员以及 CI 所安装出来的依赖版本是完全相同的。点一下运行, uv run .py 会自行自动在项目虚拟环境当中开展执行, 整个全过程都不需要。核心优势和其他虚拟环境工具比生态当中, 管理虚拟环境以及依赖的工具数量不少, 且各自所解决的问题并非完全相同:| 工具 | 定位 | 需要手动 存在版本管理, 锁文件, 速度这几方面情况, uv具备全能特性涵盖版本、包、环境、项目, uv run中不会自动进入环境, 其为内置且自动下载, 使用uv.lock文件, 速度极快venv属于标准库仅负责环境隔离, 需要手动操作, 速度慢它是venv的前身或增强版, 速度同样慢pip只负责安装包, 依赖venv, .txt并非真正的锁文件, 速度慢pip加上整合功能, run时有不同情况, 使用.lock文件, 速度慢且解析器卡顿出名存在项目加依赖管理情况, run时有不同情况, 需配合pyenv, 使用.lock文件, 速度中等pdm与之类似, 支持PEP 582, pdm run时不会自动进入环境, 部分功能可支持, 使用pdm.lock文件, 速度较快conda/mamba可用于科学计算全家桶, 也有conda run, 其并非严格锁文件, conda速度慢, mamba速度快pyenv只负责版本, 不满足适用条件, 速度情况为无相关体现。几个容易误解的地方“不用”并非uv所独有, /pdm/ 的 xxx run 命令原本即能够达成不激活而直接运行命令。事实上, 其本质一概是为子进程临时更改 PATH。uv 的优势在于将此模式予以达成其速度最快、配置最为零化的状态。· uv 的真正独特的地方在于: 它能让一个二进制同时管理版本无需配置 pyenv, 具备全局内容寻址缓存, 多个项目能共用同一份包的磁盘存储, 不用重复占用空间, 并且它完全兼容 pip 接口, uv pip 能够直接当作 pip 的替代品, 其中迁移成本几乎为零。· conda在何种状况下还应当被使用呢: 当项目所依赖的并非特定的编译库像是CUDA、MKL、某些R/Julia绑定的时候, conda或mamba凭借其二进制包管理的方式依旧显得更为适宜——uv仅仅专注于特定的生态领域, 而不会去处理涉及系统层级的二进制依赖关系。对 AI 编程助手格外友好在AI Agent编程时代, 这一点的价值被显著放大了, 倘若你所编写的脚本是要供AI如Code等调用并执行的, 那么使用uv run就意味着在给予AI的指令当中, 根本不需要专门去交代“先激活虚拟环境再促使程序执行”这一环节。每次AI发生工具调用时往往呈现为独立的shell进程状态, 其环境激活本来就难以留存, 稍有疏忽之人就会因遗忘而报错然而uv run xxx.py每次都能够自动进行定位并运用项目自身的虚拟环境, AI只需记住这一命令模式即可, 无需理会“环境是否已激活”此状态方面问题。这正是时下几乎所有新建项目直接采用uv模式展开起始工作的缘由所在——于人够称得上省心, 于AI而言更加省心。面向人群受得了开发者, 想要更快更省心, 却受够了venv加上pip再加上.txt这样又老又旧的流程, 而不是受不了venv加以pip以及.txt这套陈旧不堪的流程。· 已经在用 /pdm但嫌解析器和安装速度不够快的团队· 需要在 CI 里频繁重建虚拟环境、对安装速度敏感的项目想要一个工具, 能同时搞定版本切换, 还能搞定依赖管理, 从而减少工具链复杂度的人。使用Code等AI编程助手去编写自动化脚本, 那些不想每一回都在其中教导AI“先激活环境”的人。快速上手安装macOS / Linuxcurl -LsSf https://astral.sh/uv/install.sh | sh用 powershell -ExecutionPolicy ByPass -c irm https://astral.sh/uv/install.ps1 | iex也可以用已有的包管理器安装比如 brew install uv或者通过 pipxpipx install uv安装指定版本的 不用再单独装 pyenvuv python install 3.12新建一个项目uv init myproject cd myproject添加依赖, 此依赖会自动创建虚拟环境, 还会更新.toml, 同时也会更新uv.lock。uv add requests fastapi运行代码自动在项目虚拟环境里执行不需要手动 uv run python main.py其为同步依赖, 它会依据 uv.lock 来精准还原环境, 这种情况适合 CI 之时, 或者适合团队协作的场景。uv sync进阶用法将 CLI工具转变为系统命令, 且不会对全局环境造成污染, 这是 pipx 的直接替代。uv tool install comfy-cli # 装进独立隔离环境只把 comfy 命令暴露到 PATH comfy some-command # 之后直接执行命令行里不出现 uv也不用 activate uv tool update-shell # 首次使用前跑一次把暴露命令的目录加进 PATH uv tool list # 看装了哪些工具 uv tool upgrade comfy-cli # 升级 uv tool uninstall comfy-cli # 卸载连隔离环境一起删掉将uv用作pip的直接替换, 这是迁移老项目时手段最为便捷省事的办法。uv pip install -r requirements.txt uv pip compile requirements.in -o requirements.txt· 像 npx 一样直接运行工具不用提前安装uvx ruff check . uvx black .· 多项目 类似 Cargo 的 概念适合 在根目录 .toml 里声明tool.uv.过后, 或者 能够明白子项目相互间的依赖关联, 并非需要每一个子项目各自去管理虚拟环境。· 进行锁定依赖的操作, 然而此举并不涉及同步流程举例来说, 仅仅是想要对lock文件予以更新, 暂且不会将其落实到本地环境之中。uv lock要是你的项目仍旧处于venv加上.txt的那个时期, 花费十分钟切换到uv, 极有可能就再也不想回去了, 我自己当下所有的项目都已然全都切换到了uv, 不再独自去维护.venv 的激活步骤了。