目的
本文旨在介绍 Python 依赖管理工具 uv、uvx 和 pip,解释它们各自的用途及核心区别,帮助你根据实际需求选择合适的工具。
uv、uvx 与 pip 有何不同?
pip 是 Python 社区中最广泛使用的包安装工具。而 uv 和 uvx 由 Astral 公司开发,旨在提供更快、更可靠的替代方案。理解它们之间的差异,有助于你做出更合适的技术选型。
什么是 pip?
pip 是 Python 的标准包管理工具,用于从 Python Package Index (PyPI) 安装和管理软件包。它功能全面,支持通过 requirements.txt 文件管理项目依赖,是 Python 生态中最基础、最常用的工具。
常见用法示例:
- 安装一个包:
pip install requests
从 PyPI 安装最新版的 requests 库。
- 安装指定版本:
pip install flask==2.2.2
安装 flask 的 2.2.2 版本。
- 从 requirements.txt 安装依赖:
pip install -r requirements.txt
这是项目中非常常见的依赖安装方式。
- 升级包:
pip install --upgrade numpy
将 numpy 升级到最新可用版本。
- 卸载包:
pip uninstall requests
移除当前环境中已安装的 requests 包(通常会提示确认)。
- 列出已安装的包:
pip list
显示当前环境中所有已安装的包及其版本。
- 以 requirements.txt 格式输出依赖:
pip freeze
输出精确版本的依赖列表,适用于生成 requirements.txt。
什么是 uv?
uv 是一个用 Rust 编写的高性能 Python 包安装器和依赖解析器。它被设计为 pip 和 pip-tools 工作流的“无缝替代品”,专注于速度与可靠性,支持依赖解析、锁定、安装以及虚拟环境管理。其目标是成为“Python 的 Cargo”(Cargo 是 Rust 的构建与包管理工具)。
常见用法示例:
- 创建虚拟环境:
uv venv
在当前目录下创建名为 .venv 的虚拟环境。
- 激活虚拟环境(Linux/macOS):
source .venv/bin/activate
- 激活虚拟环境(Windows):
.venv\Scripts\activate
- 安装包(使用 uv 替代 pip):
uv pip install requests
功能等同于 pip install,但通常快得多。
- 从 requirements.txt 安装:
uv pip install -r requirements.txt
- 编译依赖文件(类似 pip-compile):
uv pip compile requirements.in -o requirements.txt
读取 requirements.in 中的依赖,生成带精确版本号的锁定文件 requirements.txt。
- 同步环境(类似 pip-sync):
uv pip sync requirements.txt
使当前环境中的包与 requirements.txt 中的版本完全一致(自动安装或卸载)。
- 向项目添加依赖(需 pyproject.toml):
uv add flask
将 flask 添加到 pyproject.toml,并自动更新 uv.lock 文件和同步环境。
- 在项目环境中运行脚本:
uv run python your_script.py
无需手动激活虚拟环境,直接在项目环境中执行脚本。
什么是 uvx?
uvx 是 uv 工具链的一部分,本质上是 uv tool run 命令的便捷别名。它的主要用途是在临时、隔离的环境中运行 Python 工具或脚本,无需全局安装或提前激活虚拟环境。这对于运行 linter(如 ruff)、formatter(如 black)或其他 CLI 工具非常有用——既能确保使用特定版本,又不会污染全局环境。
✅ 关键点:uvx 是 uv tool run 的快捷方式,专为“一次性”运行工具而设计。
常见用法示例:
- 无需全局安装即可运行工具:
uvx ruff check your_module.py
uvx 会自动在临时环境中安装(或复用缓存的)ruff,执行检查后清理环境(但会缓存以便下次快速启动)。
- 运行指定版本的工具:
uvx black@23.7.0 your_script.py
使用 black 的 23.7.0 版本来格式化脚本。
- 运行带额外依赖的工具:
uvx --with 'mypy[extra]' mypy your_module.py
在临时环境中安装 mypy 及其 [extra] 可选依赖后再运行。
- 从特定包运行命令(命令名 ≠ 包名):
uvx --from httpie http example.com
虽然命令是 http,但它来自 httpie 包,–from 指定了来源包。
三者对比总结
| 功能 / 特性 | pip | uv | uvx |
|---|---|---|---|
| 核心功能 | 安装、卸载、升级、列出包 | 安装、解析、锁定依赖;管理虚拟环境 | 在临时环境中运行工具或脚本 |
| 性能 | 相对较慢,尤其依赖复杂时 | 极快(Rust 实现) | 启动快,无需预安装 |
| 依赖解析 | 新版有所改进,但冲突处理不透明 | 高度优化,错误清晰,冲突解决能力强 | 在临时环境中解析并安装依赖 |
| 虚拟环境支持 | 需配合 venv 或 virtualenv | 内置支持,可自动创建 | 自动创建并管理临时虚拟环境 |
| 锁文件(Lock File) | 需借助 pip-tools 等工具 | 原生支持生成跨平台锁文件(uv.lock) | 通常不需要显式锁文件 |
| 工具执行方式 | 需全局安装或激活环境 | 通过 uv run 在项目环境中运行 | 直接运行指定工具及其依赖,无需安装 |
| 易用性 | 广泛采用,文档丰富 | CLI 直观,部分命令兼容 pip | 一行命令即可运行一次性工具 |
| 安装方式 | 通常随 Python 一起安装 | 可通过独立脚本或 pip 安装 | 作为 uv 的一部分自动安装 |
📌 总结:
- pip 是基础且通用的包管理器;
- uv 是现代化的增强版,集成了依赖解析、锁文件、虚拟环境等功能,性能卓越;
- uvx 则专注于“按需运行工具”,避免环境污染,提升开发效率。
关键建议
- 如果你需要精细控制依赖流程,或项目必须兼容传统生态,继续使用 pip。
- 如果你追求速度、一致性,并希望简化依赖管理(尤其是新项目),优先考虑 uv。
- 如果你只是想临时运行某个工具(比如格式化代码、检查类型),直接用 uvx,无需安装。
⚠️ 重要概念澄清:
uvx 不是用来替代 pip 的!它只负责“运行工具”。如果你需要安装依赖、管理项目环境,请使用 uv(或传统的 pip)。
总结
本文详细介绍了 uv、uvx 和 pip 在 Linux(及 macOS)环境下的区别。选择哪个工具,最终取决于你的项目需求和个人偏好:
- 对于大多数现有项目,或对极致性能无强要求的场景,pip 依然是可靠的选择;
- 对于新项目,或需要频繁处理复杂依赖、快速搭建环境的场景,uv 是更优解;
- 而 uvx 则是一个轻量级助手,适合快速运行那些“用完即走”的开发工具。
后记
很多人对uvx感觉比较陌生甚至难以理解,这是因为平时就算经常开发Python也可能很少用一些Python工具,而许多 Python 包提供了可作为命令行工具使用的应用程序。
uvx 命令可以在不显式安装的情况下直接运行一个工具。
例如,要运行 ruff
uvx ruff
上述命令与以下命令完全等价:
uv tool run ruff
uvx 仅是为方便使用而提供的别名。
工具和普通Python模块的区别
一个 Python 包要成为“工具”,必须在打包时声明 控制台脚本入口(console_scripts)。例如 ruff 的 pyproject.toml 中可能包含:
[project.scripts]
ruff = "ruff_cli:main"
这告诉 pip/uv:“安装这个包时,请创建一个叫 ruff 的可执行命令,它会调用 ruff_cli.main()”。
而 requests 这样的库没有这样的声明,所以你不能在终端直接敲 requests —— 它只是一个供 import 的模块。
uv run vs uvx
🔸 uv run:在当前项目环境中运行任意命令
本质是:激活当前项目的虚拟环境 + 执行命令
可以运行:
- Python 模块:uv run python -m http.server
- 已安装的工具:uv run pytest
- 任意 shell 命令:uv run echo “hello”
🔸 uvx(或 uv tool run):临时运行一个“工具”
- 不依赖当前项目环境
- 自动为该工具创建独立临时环境
- 只适用于提供了 CLI 命令的包
为什么 MCP(或 AI Agent 系统)喜欢用 uvx (或npx)
在构建 AI 智能体(Agent)、工具调用(Tool Calling) 或 MCP(Model Context Protocol) 系统时,经常会遇到这样的需求:
“让大模型动态决定使用哪个工具,并立即执行它。”
但问题来了:
- 你不可能预装所有可能用到的工具(成千上万)。
- 不同工具依赖不同版本,容易冲突。
- 安全性和隔离性很重要。
1042

被折叠的 条评论
为什么被折叠?



