很多人遇到的痛点其实都一样:项目 A 需要某个版本的依赖,项目 B 又需要另一套;再加上全局安装的命令行工具(例如 ruff、black、httpie)越装越多,最后系统 Python 变得不可控。一个更稳的思路是把「项目依赖」和「全局工具」分开管理:
1)项目依赖:交给 uv 来创建虚拟环境、安装依赖、生成锁定文件;
2)全局工具:交给 pipx,把每个 CLI 工具装在独立隔离环境里,但命令又能全局调用。
uv:https://github.com/astral-sh/uv
uv 的安装方式很多,下面给出几种常见选择,你只需要选一种即可:
macOS(Homebrew):brew install uv
Windows(WinGet):winget install --id Astral.uv
通用安装脚本(官方推荐之一):curl -LsSf https://astral.sh/uv/install.sh | sh
安装完成后先检查版本与路径:
uv --version
在你的项目目录里,推荐用 uv 直接初始化并创建虚拟环境:
uv venv
随后用 uv 安装依赖(示例以 requests 为例):
uv pip install requests
如果你希望把依赖写入项目配置(例如 pyproject.toml),可以配合你习惯的依赖声明方式;而 uv 负责执行安装与加速下载。对于团队协作,建议生成锁定文件,保证每个人装到的版本一致(命令示例会因项目结构不同而略有差异)。
很多工具其实不应该装进某个项目里,而是作为“全局命令”随时可用,例如格式化、静态检查、HTTP 调试等。pipx 的价值就在这里:每个工具独立隔离,但命令统一可用。
安装 pipx(示例):
python -m pip install --user pipx
python -m pipx ensurepath
用 pipx 安装常用工具(举例 ruff、black):
pipx install ruff
pipx install black
如果你更希望 pipx 也走 uv 的速度,可以把 uv 作为 pip 的替代后端(具体以你当前环境可用方式为准)。核心原则不变:项目依赖回到项目里,全局工具保持隔离。
1)新项目:先 uv venv,再安装依赖;
2)写代码:用 pipx 安装并运行质量工具(例如 ruff / black),不把它们塞进每个项目;
3)协作交付:把依赖声明与锁定文件提交到仓库,让团队环境更可复现。
Q1:命令找不到(Windows/macOS)
优先检查 PATH。pipx 执行 ensurepath 后通常需要重新打开终端;macOS 上如果用 brew 安装 uv,也建议重开终端确认 uv --version 能正常输出。
Q2:系统 Python 被污染怎么办?
把“全局安装”尽量迁移到 pipx;项目依赖全部放到虚拟环境中。不要在系统 Python 上随意 pip install 一堆库。
Q3:如何保持多个项目互不影响?
每个项目一个独立虚拟环境是底线。uv 的 uv venv + 项目内依赖安装,可以让不同项目之间互不干扰。
uv 负责“项目依赖的快与稳”,pipx 负责“全局工具的隔离与可用”。把两者组合起来,你会发现 Python 环境从此更可控,装机和换项目也更轻松。