Python依赖管理工具,如何实现高效的环境管理?

摘要:0 序 学习一款新的Python依赖包管理与环境管理工具: UV。 "最近几个月,我注意到一个现象:看到的新开源项目里,越来越多开始在README里写uv pip install而不是pip install。&am
0 序 学习一款新的Python依赖包管理与环境管理工具: UV。 "最近几个月,我注意到一个现象:看到的新开源项目里,越来越多开始在README里写uv pip install而不是pip install。" 2025年,Python包管理工具已经由pip变成了uv? - Weixin/机器学习实验室 2025.11.13 全文主要摘自此篇。 比如最近与Kimi K2 Thinking一起发布的Kimi CLI就是通过uv命令安装的: uv tool install --python 3.13 kimi-cli 在 Python 开发中,包管理和环境隔离是每个开发者都会遇到的问题。 无论是 pip 的缓慢、virtualenv 的繁琐,还是 conda 的臃肿,都让开发者们期待一个更高效的解决方案。 1 概述: UV := Universal Virtual := Python 包与环境管理工具 uv是什么? uv (Universal Virtual) 是 Astral 公司开发了一款新的Python包管理工具。 提到Astral,你可能会想起他们去年发布的Ruff。 那个用Rust写的Python linter,速度快到离谱,现在已经是很多项目的标配。 uv目前在Github斩获73k的star。 https://github.com/astral-sh/uv Slogan : An extremely fast Python package and project manager, written in Rust. 一款用Rust编写的、非常快的Python包和项目管理器。 2024 年 2 月首次发布,当时的定位是更快的pip。几个月后,功能大幅扩展,变成了一个统一的Python工具链。 现在的uv,官方说可以替代pip、pip-tools、pipx、poetry、pyenv、virtualenv这一堆工具。 性能实测:快得离谱 先说性能,这是uv最吸引人的地方。 官方说uv比pip快10-100倍。一开始有大佬觉得这数字有点夸张,但看了一些真实案例后,确实差不多。 典型案例: 2024年4月,Streamlit把所有用户的包管理从pip切换到了uv。 结果是什么? 平均依赖安装时间从60秒降到了20秒,应用部署时间直接提升了55%。 这不是实验室数据,是真实的生产环境,每天数万个应用在跑。 包安装速度对比(无缓存): 安装pandas:1.22s (uv) vs 2.62s (pip) - 快 53% 安装numpy + scipy + torch:3.5s (uv) vs 14.8s (pip) - 快 4.2 倍 解析50+ 包的requirements.txt:5.1s (uv) vs 28.4s (pip) - 快 5.6 倍 有缓存的情况下: Jupyter Notebook项目解析:0.57s(冷启动)→ 0.02s(温缓存) 这个速度提升就是几十倍到上百倍了 虚拟环境创建: uv创建虚拟环境比python -m venv快80倍 比virtualenv快7倍 除了速度快,【资源占用】也更少: CPU 使用:68% (uv) vs 92% (pip) 内存占用:210MB (uv) vs 450MB (pip) 这意味着,在CI/CD环境或者【资源受限】的机器上,uv的优势会更明显。 为什么性能这么快? 看到这些数据,你可能会好奇:uv凭啥这么快? 首先,编程语言。 pip是用Python写的,uv用的是Rust。Rust是系统级编程语言,性能接近 C/C++。 这是基础性能差异。 其次,uv充分利用了Rust的并发特性。 传统的pip在下载和安装包时,大部分操作是串行的; 而uv可以同时处理多个依赖的下载、构建和安装。 在依赖树比较复杂的项目里,这种【并发处理】带来的提升非常明显。 此外,uv还有一个【全局模块缓存系统】。 当你第一次安装一个包后,uv会把它缓存起来。 下次再安装同样的包(可能是在不同的项目里),uv直接从缓存读取,甚至不需要重新下载。 而且在支持的文件系统上,uv使用【写时复制】(Copy-on-Write)和【硬链接】技术。 这意味着,同一个包在多个【虚拟环境】中共享,不会占用多倍的【磁盘空间】。 最后是,依赖解析算法。 依赖解析是【包管理】中最复杂的部分。 uv使用了【更高效的算法】来解析【依赖图】,支持平台无关的解析,还能生成跨平台的【锁文件】。 这不只是快,还更可靠。 不只是快:功能全面 【速度】,只是uv的一个卖点。让人更感兴趣的是,它想成为一个【全能工具】。 最基础的功能:uv可以完全替代pip # 传统方式 pip install requests # uv方式 uv pip install requests 命令几乎一样,学习成本很低。 而且uv还支持很多pip没有的高级特性,比如依赖版本覆盖、更灵活的解析策略等。 首先,uv可以像Poetry一样管理整个项目: # 初始化项目 uv init my-project # 运行项目 uv run main.py # 生成跨平台锁文件 uv lock # 同步环境 uv sync 生成的lockfile,确保团队成员和CI环境都用完全相同的依赖版本。 uv也可以用于Python的版本管理(替代 pyenv),这个功能让我挺意外的: # 安装 Python 3.12 uv python install 3.12 # 在当前目录下使用特定版本 uv python pin 3.12 uv可以直接下载和管理Python版本,不需要额外装pyenv或 pythonbrew。 uv也可以用于工具管理(替代 pipx),比如说需要安装一个【全局命令行工具】? # 安装工具 uv tool install ruff # 或一次性运行,不安装 uvx ruff check . uvx这个命令特别方便,想临时用一个工具的时候,不需要先装到全局环境。 uv还支持单文件Python脚本的依赖管理。 你可以在脚本开头声明依赖,然后用uv run script.py直接运行,uv会自动处理依赖安装和环境隔离。 这对写一些小工具脚本非常友好。 uv 的优势 速度极速:由于使用 Rust 编写,uv 的性能远超 pip 和其他包管理工具,安装依赖的速度可以提升 10-100 倍。 比 pip 快 10-100 倍,比 Conda 快 100 倍以上。 功能集成/一体化功能:集成虚拟环境管理、依赖锁定、Python 版本控制等。 集成语法分析、依赖解析、包安装、环境管理和 Python 版本管理于一体,无需再安装和学习多个工具。 确定性构建:uv 会生成 uv.lock 文件,确保在任何环境中都能安装完全相同的依赖版本,避免 "在我机器上能运行" 的问题。 与现有工具兼容:uv 可以处理 requirements.txt 和 pyproject.toml,可以无缝替代现有工作流中的 pip。 兼容 pip、requirements.txt 和 pyproject.toml。 跨平台支持:兼容 Windows、macOS 和 Linux。 零依赖:单文件二进制,无需额外安装 Python 环境。 uv能不能替代Conda / Pip? 这取决于使用场景: uv专注于Python依赖包管理,对于纯Python项目,它完全够用,而且更快更轻量。 但Conda可以管理【系统级依赖】(比如:CUDA、各种C库),在科学计算和深度学习领域,Conda还是有它的生态位置。 另外,有些CI平台对uv的支持还在完善中,可能需要自己写一点额外的配置。 偶尔会遇到一些包的构建问题,特别是那些有C扩展的老包。 不过这种情况不多,而且一般切回pip就能解决。 推荐做法:纯Python项目用uv,需要系统依赖的项目(比如 PyTorch GPU 版)还是用pip或者Conda。 应该对这些新的工具保持一点耐心,也许未来上述这种场景也将会被弥补上来。 "这就像你的Vibe Coding工具,在没用Claude Code之前,你用其他工具觉得非常好用。但是一旦用了Claude Code之后,就很难再用回其他工具。" 2 安装使用篇 说了这么多,不如亲自试一试。 2.1 安装 UV uv不需要预先安装Python和Rust,安装脚本会处理所有依赖。 2.1.1 安装 on MacOS/Linux brew install uv 或: curl -LsSf https://astral.sh/uv/install.sh | sh 2.1.2 安装 on Windows CMD or PowerShell 窗口: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 安装日志: C:\Users\EDY>powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" Downloading uv 0.9.15 (x86_64-pc-windows-msvc) Installing to C:\Users\EDY\.local\bin uv.exe uvx.exe uvw.exe everything's installed! To add C:\Users\EDY\.local\bin to your PATH, either restart your shell or run: (为了便于基于 uv 命令便捷/快速地使用,可自行配置 PATH 环境变量 或执行:) set Path=C:\Users\EDY\.local\bin;%Path% (cmd) $env:Path = "C:\Users\EDY\.local\bin;$env:Path" (powershell) 安装完成后,按提示将UV添加到系统PATH(Linux: 默认路径:~/.local/bin 或 $HOME/.cargo/bin) 2.2 安装验证 安装完成后,验证安装是否成功: uv --version 输出内容类似如下,表明安装成功: uv 0.9.15 (5eafae332 2025-12-02) 或: uv 0.8.14 (Homebrew 2025-08-28) ... 2.3 管理 Python 版本 uv 可以轻松管理多个 Python 版本,无需额外安装 pyenv 等工具。 查看可用的 Python 版本 uv python list 输出结果类似如下: C:\Users\EDY>uv python list cpython-3.15.0a2-windows-x86_64-none <download available> cpython-3.15.0a2+freethreaded-windows-x86_64-none <download available> cpython-3.14.1-windows-x86_64-none <download available> cpython-3.14.1+freethreaded-windows-x86_64-none <download available> cpython-3.13.10-windows-x86_64-none <download available> cpython-3.13.10+freethreaded-windows-x86_64-none <download available> cpython-3.12.12-windows-x86_64-none <download available> cpython-3.11.14-windows-x86_64-none <download available> cpython-3.10.19-windows-x86_64-none <download available> cpython-3.10.11-windows-x86_64-none AppData\Local\Programs\Python\Python310\python.exe cpython-3.9.25-windows-x86_64-none <download available> cpython-3.8.20-windows-x86_64-none <download available> pypy-3.11.13-windows-x86_64-none <download available> pypy-3.10.16-windows-x86_64-none <download available> pypy-3.9.19-windows-x86_64-none <download available> pypy-3.8.16-windows-x86_64-none <download available> graalpy-3.12.0-windows-x86_64-none <download available> graalpy-3.11.0-windows-x86_64-none <download available> graalpy-3.10.0-windows-x86_64-none <download available> 安装特定版本的 Python # 安装最新的 Python 3.12 uv python install 3.12 # 安装特定版本 uv python install 3.11.6 # 安装 PyPy 版本 uv python install pypy3.10 设置全局默认 Python 版本 uv python default 3.12 在项目中指定 Python 版本 # 为当前项目固定 Python 3.11 uv python pin 3.11 这会创建 .python-version 文件,标识项目所需的 Python 版本。 2.4 管理虚拟环境 创建并激活虚拟环境: # 创建名为 .venv 的虚拟环境(默认) uv venv # 激活环境(macOS/Linux) source .venv/bin/activate # 激活环境(Windows) .venv\Scripts\activate 2.5 依赖包管理 安装依赖包: # 安装最新版本 uv pip install requests # 安装特定版本 uv pip install requests==2.31.0 # 从 requirements.txt 安装 uv pip install -r requirements.txt 安装包到开发环境: uv pip install --dev pytest 升级包: uv pip upgrade requests 卸载包: uv pip uninstall requests 导出依赖: # 导出当前环境的依赖 uv pip freeze > requirements.txt # 导出生产环境依赖(排除开发依赖) uv pip freeze --production > requirements.txt 2.5 项目管理 uv 支持 pyproject.toml 格式的项目管理,这是现代 Python 项目的标准配置文件。 初始化一个新项目: uv init my_project cd my_project 这会创建基本的项目结构和 pyproject.toml 文件。 安装项目的依赖: uv sync 这个命令会根据 pyproject.toml 和 requirements.txt 安装所有依赖。类似于 pip install -e . 但更高效。 说明: uv sync 是一个依赖管理命令,它的作用类似于您可能更熟悉的 pip install -r requirements.txt,但更快、更强大、更可靠。 您可以把它理解为:"一键安装这个项目正常运行所需的所有第三方软件包(依赖库)"。 uv sync 如果安装太慢,可以设置国内镜像源 https://pypi.tuna.tsinghua.edu.cn/simple: 在项目根目录的 pyproject.toml 文件 [tool.uv] 处设置 index-url: [tool.uv] index-url = "https://pypi.tuna.tsinghua.edu.cn/simple" 2.x 使用场景集 2.x.1 场景: pip 的平替 如果你只想把uv当作更快的pip,直接替换命令就行: # 创建虚拟环境 uv venv # 激活环境(和之前一样) source .venv/bin/activate # macOS/Linux .venv\Scripts\activate # Windows source .venv/Scripts/activate # Windows on Git Bash # 安装包 uv pip install pandas numpy # 导出依赖 uv pip freeze > requirements.txt # 从文件安装 uv pip install -r requirements.txt 基本上就是把pip换成uv pip,其他都一样。 对于已有项目,如果需要迁移的话,可以采样【渐进式迁移方式】: 先在本地开发环境试用uv 验证没问题后,更新CI/CD配置 团队成员逐步切换 另外,因为uv和pip是兼容的,【迁移过程】中几乎不会出现环境上冲突。 2.x.2 迁移到 uv 如果你正在使用其他工具,可以轻松迁移到 uv: 对于使用 pip + virtualenv 的项目: # 创建并激活 uv 虚拟环境 uv venv source .venv/bin/activate # 安装依赖 uv pip install -r requirements.txt 对于使用 pip-tools 的项目: uv pip compile requirements.in -o requirements.txt uv pip sync 对于使用 poetry 或 pdm 的项目: # 直接使用现有的 pyproject.toml uv sync Y 推荐文献 UV docs : https://docs.astral.sh/uv/ github : https://github.com/astral-sh/uv [Python3] Python 基础教程 - 博客园/千千寰宇 [Python] 包管理器Pip - 博客园/千千寰宇 [Python] Miniforge: 开源版conda环境管理器 - 博客园/千千寰宇 [Python/虚拟环境/包管理] conda:多环境管理与包管理器 - 博客园/千千寰宇 [Python] Python 虚拟环境管理 - 博客园/千千寰宇 X 参考文献 2025年,Python包管理工具已经由pip变成了uv? - Weixin/机器学习实验室 2025.11.13