虚拟环境与依赖管理
概述
在 Python 项目开发中,包管理与虚拟环境是两个不同维度的概念,但又紧密相关:
- 包管理:负责包的安装、更新、卸载等操作(如
pip、poetry、uv pip)。 - 虚拟环境:负责为每个项目隔离依赖,避免项目之间的包版本冲突(如
venv、virtualenv、uv venv)。
为什么要使用虚拟环境?
- 依赖隔离:不同项目可能依赖同一个包的不同版本,虚拟环境可以让每个项目拥有自己独立的依赖。
- 环境可复现:通过锁文件(如
poetry.lock、uv.lock)可以精确还原项目环境。 - 避免污染全局环境:把所有的包都安装在全局环境,会让全局环境变得臃肿且难以维护。
- 便于协作:团队成员可以通过虚拟环境配置,快速获得一致的开发环境。
一、包管理工具
pip(官方 · 2008)
pip 是 Python 官方推荐的包管理工具,提供了对 Python 包的查找、下载、安装、卸载等功能。它是所有现代包管理工具的底层引擎。
优点与缺点
优点:
- Python 官方维护,稳定可靠。
- 免安装即用(Python 3.4+ 内置)。
- 生态最完整,几乎所有第三方包都支持。
缺点:
- 无依赖冲突解决能力(只能按顺序安装,依赖冲突时容易出问题)。
- 无环境隔离功能(默认安装到全局环境)。
安装与升级
# 升级 pip 自身
python -m pip install --upgrade pip
# 查看 pip 版本
pip --version
# 或
pip -V安装包
| 命令 | 说明 |
|---|---|
pip install 包名 | 安装最新版本的包 |
pip install 包名==1.0.0 | 安装指定版本 |
pip install 包名>=1.0,<2.0 | 安装版本范围 |
pip install -r requirements.txt | 根据文件批量安装 |
pip install -e . | 以可编辑模式安装本地项目 |
pip install -U 包名 或 pip install --upgrade 包名 | 升级包到最新版 |
pip install --no-deps 包名 | 只安装包本身,不安装依赖 |
pip install --pre 包名 | 允许安装预发布版本 |
pip download 包名 | 仅下载包,不安装(适合离线场景) |
卸载与查询
| 命令 | 说明 |
|---|---|
pip uninstall 包名 | 卸载指定的包 |
pip uninstall -r requirements.txt -y | 批量卸载(-y 跳过确认) |
pip list | 列出已安装的所有包 |
pip list --outdated | 列出可升级的包 |
pip list --format=columns | 以表格形式展示(默认) |
pip list --format=json | 以 JSON 格式展示 |
pip show 包名 | 查看指定包的详细信息 |
pip check | 检查依赖冲突 |
pip search 包名 | 搜索包(已废弃,PyPI 已禁用) |
导出依赖
| 命令 | 说明 |
|---|---|
pip freeze | 以 requirements.txt 格式输出所有已安装包 |
pip freeze > requirements.txt | 导出到文件 |
pip freeze --local | 仅导出当前虚拟环境的包(不含全局) |
镜像源配置
# 临时使用(仅本次命令生效)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
# 设置全局默认镜像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 同时设置多个源(索引镜像 + 信任主机)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
# 查看当前 pip 配置
pip config list
# 恢复使用官方默认源
pip config unset global.index-url常用国内镜像地址
缓存管理
| 命令 | 说明 |
|---|---|
pip cache list | 查看缓存的所有包 |
pip cache info | 查看缓存信息(大小、位置等) |
pip cache remove 包名 | 删除指定包的缓存 |
pip cache purge | 清空所有缓存 |
pip install --no-cache-dir 包名 | 安装时不使用缓存 |
二、虚拟环境工具
virtualenv(2007)
virtualenv 是 Python 生态中最早出现的虚拟环境工具,被称为**"旧时代的产物"**。它由 Ian Bicking 开发,是后续 venv 的前身。
特点
- ✅ 兼容 Python 2。
- ✅ 可指定任意 Python 解释器版本。
- ❌ 在 Windows 上兼容性偏弱。
- ❌ 已被 Python 3.3+ 内置的
venv取代,新项目不再推荐使用。
安装
# 通过 pip 安装
pip install virtualenv
# 查看版本
virtualenv --version创建虚拟环境
| 命令 | 说明 |
|---|---|
virtualenv myenv | 创建名为 myenv 的虚拟环境 |
virtualenv -p python3.11 myenv | 指定 Python 解释器版本 |
virtualenv --system-site-packages myenv | 允许访问全局已安装的包 |
virtualenv --no-seed myenv | 不预装 pip、setuptools、wheel |
virtualenv --clear myenv | 如果存在则先清空再创建 |
virtualenv --relocatable myenv | 创建可重定位的虚拟环境 |
激活与退出
# Windows(CMD)
myenv\Scripts\activate.bat
# Windows(PowerShell)
myenv\Scripts\Activate.ps1
# macOS / Linux
source myenv/bin/activate
# 退出虚拟环境(任意系统)
deactivatevenv(Python 3.3+ 内置 · 2012)
venv 是 Python 官方内置的虚拟环境模块,自 Python 3.3 起随标准库一起发布。它是当前最简单、最轻量的虚拟环境方案。
特点
- ✅ Python 内置,零依赖、零安装。
- ✅ 简单即正义,上手成本极低。
- ❌ 功能简陋,无法创建非系统版本的 Python 环境(需要配合
pyenv使用)。 - ❌ 没有依赖锁定、依赖解析等高级功能。
创建虚拟环境
| 命令 | 说明 |
|---|---|
python -m venv myenv | 创建名为 myenv 的虚拟环境 |
python -m venv myenv --system-site-packages | 允许访问全局已安装的包 |
python -m venv myenv --without-pip | 不预装 pip |
python -m venv myenv --prompt=myproject | 自定义激活后提示符前的名称 |
python -m venv myenv --clear | 如果存在则先清空再创建 |
python -m venv myenv --upgrade | 升级已有虚拟环境(Python 版本升级时用) |
python -m venv myenv --copies | 复制 Python 可执行文件而非符号链接 |
激活与退出
# Windows(CMD)
myenv\Scripts\activate.bat
# Windows(PowerShell)
myenv\Scripts\Activate.ps1
# macOS / Linux
source myenv/bin/activate
# 退出虚拟环境(任意系统)
deactivate激活后的变化
激活后,命令行提示符前会出现环境名(如 (myenv)),表示当前正在该虚拟环境中操作:
pip指向虚拟环境内的 pip。python指向虚拟环境内的 Python 解释器。- 通过
pip安装的包只会安装到当前虚拟环境。
三、版本管理工具
pyenv(2014)
pyenv 是一个Python 版本管理工具,用于在同一台机器上安装、切换多个 Python 版本。它解决了类似 "我本地是 Python 3.10,服务器是 3.8" 的经典问题。
特点
- ✅ 纯 Shell 实现,不依赖 Python 本身。
- ✅ 通过改写
PATH环境变量切换 Python 版本,干净无侵入。 - ✅ 配合
pyenv-virtualenv插件,可同时管理虚拟环境。 - ❌ Windows 支持较弱(需使用
pyenv-win)。 - ❌ 不管理依赖,需搭配
venv、pipenv或poetry使用。
安装
# macOS(推荐使用 Homebrew)
brew update
brew install pyenv
# Linux(自动安装脚本)
curl https://pyenv.run | bash
# 安装完成后,需要把以下内容加入 ~/.bashrc 或 ~/.zshrc:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"查看版本
| 命令 | 说明 |
|---|---|
pyenv install --list | 列出所有可安装的 Python 版本(含 Anaconda、PyPy 等) |
| `pyenv install --list | grep "3.[0-9]"` |
pyenv versions | 列出已安装的所有 Python 版本 |
pyenv version | 显示当前激活的 Python 版本 |
pyenv which python | 显示当前 python 命令的实际路径 |
pyenv commands | 列出 pyenv 的所有命令 |
安装与卸载
| 命令 | 说明 |
|---|---|
pyenv install 3.12.0 | 安装指定版本 |
pyenv install -v 3.12.0 | 显示详细安装过程 |
pyenv install 3.12.0 --enable-shared | 安装时启用共享库(某些场景需要) |
pyenv uninstall 3.12.0 | 卸载指定版本 |
切换版本
| 命令 | 说明 |
|---|---|
pyenv global 3.12.0 | 设置全局默认版本(影响整个用户) |
pyenv local 3.11.0 | 在当前目录下设置版本(写入 .python-version 文件) |
pyenv shell 3.10.0 | 设置当前 shell 会话的版本(仅当前终端) |
pyenv shell --unset | 取消 shell 版本设置 |
pyenv rehash | 刷新 shims(安装新版本的 Python 后需要执行) |
虚拟环境插件(pyenv-virtualenv)
# 安装插件
brew install pyenv-virtualenv
# Linux
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
# 创建虚拟环境(基于指定 Python 版本)
pyenv virtualenv 3.12.0 myenv
# 激活虚拟环境
pyenv activate myenv
# 退出虚拟环境
pyenv deactivate
# 列出所有虚拟环境
pyenv virtualenvs
# 删除虚拟环境
pyenv uninstall myenv四、项目管理工具(依赖 + 环境 + 打包一体化)
随着项目复杂度提升,单纯的 pip + venv 已经无法满足需求,于是出现了一批一体化的项目管理工具,它们将虚拟环境、依赖管理、打包发布整合在一起。
Pipenv(2017)
由 Kenneth Reitz(requests 库作者)开发,号称 "Python 开发工作流的未来"。它引入了 Pipfile 和 Pipfile.lock 两个文件,分别用于声明依赖和锁定版本。
现状
社区活跃度近年明显下降,依赖解析速度较慢,新项目不建议使用。
安装
pip install pipenv创建与管理环境
| 命令 | 说明 |
|---|---|
pipenv install | 安装 Pipfile 中的所有依赖(首次会创建虚拟环境) |
pipenv install requests | 安装包并添加到 Pipfile |
pipenv install requests==2.31.0 | 安装指定版本 |
pipenv install --dev pytest | 安装开发依赖 |
pipenv uninstall 包名 | 卸载包 |
pipenv uninstall --all | 卸载所有包 |
pipenv shell | 激活虚拟环境的 shell |
pipenv run python main.py | 在虚拟环境中执行命令 |
pipenv --rm | 删除当前虚拟环境 |
pipenv --venv | 显示虚拟环境路径 |
pipenv --py | 显示虚拟环境中的 Python 解释器路径 |
依赖锁定与同步
| 命令 | 说明 |
|---|---|
pipenv lock | 生成 Pipfile.lock(不安装) |
pipenv lock -r | 输出 requirements.txt 格式 |
pipenv sync | 根据 Pipfile.lock 同步环境 |
pipenv sync --dev | 同步包括开发依赖 |
pipenv update | 更新所有依赖并重新生成 lock |
pipenv update requests | 更新指定依赖 |
检查与诊断
| 命令 | 说明 |
|---|---|
pipenv graph | 显示依赖关系图 |
pipenv check | 检查安全漏洞 |
pipenv --clear | 清除缓存 |
Poetry(2018)
由 Sébastien Eustace 开发,被誉为 "在 uv 出现前最好用的 Python 项目管理工具"。它基于 pyproject.toml(PEP 518 标准)+ poetry.lock,被类比为 Python 界的 Cargo(Rust)或 npm(JavaScript)。
特点
- ✅ 依赖解析算法优秀,能可靠地解决复杂的依赖冲突。
- ✅ 自动管理虚拟环境(无需手动
source activate)。 - ✅ 内置打包发布功能(
poetry publish)。 - ✅
pyproject.toml是 Python 官方推荐的项目配置标准。 - ❌ 上手成本略高。
- ❌ 依赖解析在大型项目中可能较慢。
- ❌ 部分细节(如全局镜像源设置)配置不够友好。
安装
# 官方安装脚本(macOS / Linux / WSL)
curl -sSL https://install.python-poetry.org | python3 -
# PowerShell(Windows)
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
# pip 安装
pip install poetry
# 查看版本
poetry --version项目初始化
| 命令 | 说明 |
|---|---|
poetry new myproject | 创建新项目(含目录结构) |
poetry init | 在已有目录中初始化(交互式问答) |
poetry init --no-interaction | 非交互式初始化 |
依赖管理
| 命令 | 说明 |
|---|---|
poetry install | 安装 pyproject.toml 中的所有依赖 |
poetry add requests | 添加依赖 |
poetry add requests==2.31.0 | 添加指定版本 |
poetry add "requests>=2.31,<3" | 添加版本范围 |
poetry add --group dev pytest | 添加开发依赖(PEP 621 风格) |
poetry add -D pytest | 添加开发依赖(简写,同上) |
poetry add git+https://github.com/xxx/yyy.git | 从 Git 仓库添加 |
poetry add ./pkg.whl | 从本地 wheel 文件添加 |
poetry remove requests | 移除依赖 |
poetry update | 更新所有依赖 |
poetry update requests | 更新指定依赖 |
poetry show | 列出已安装的所有包 |
poetry show requests | 查看指定包的详细信息 |
poetry show --tree | 以树形结构展示依赖关系 |
poetry show --outdated | 列出可更新的包 |
poetry export -f requirements.txt --output requirements.txt | 导出为 requirements.txt |
poetry export --without-hashes | 导出时去掉哈希(部分场景需要) |
虚拟环境管理
| 命令 | 说明 |
|---|---|
poetry env use python3.11 | 指定虚拟环境使用的 Python 版本 |
poetry env use /path/to/python | 使用指定路径的 Python 解释器 |
poetry env list | 列出所有关联的虚拟环境 |
poetry env info | 查看当前虚拟环境信息 |
poetry env remove python3.11 | 删除指定虚拟环境 |
poetry shell | 激活虚拟环境 |
poetry run python main.py | 在虚拟环境中执行命令 |
poetry run pytest | 在虚拟环境中运行测试 |
poetry config virtualenvs.create false | 配置不自动创建虚拟环境 |
配置管理
# 查看所有配置
poetry config --list
# 设置虚拟环境目录
poetry config virtualenvs.path /path/to/envs
# 设置镜像源(国内加速)
poetry source add --priority=primary tsinghua https://pypi.tuna.tsinghua.edu.cn/simple/打包与发布
| 命令 | 说明 |
|---|---|
poetry build | 构建 wheel 和 sdist 包 |
poetry publish | 发布到 PyPI |
poetry publish --build | 构建后立即发布 |
poetry publish --repository testpypi | 发布到 TestPyPI |
poetry check | 验证 pyproject.toml 配置是否正确 |
PDM(2020)
由 Frost Ming 开发,支持 PEP 582(项目本地包目录,无需激活虚拟环境即可使用项目内的依赖)。
特点
- ✅ 依赖解析速度快(基于更现代的算法)。
- ✅ 支持 PEP 582 项目本地包目录(类似
node_modules的体验)。 - ✅ 兼容
pyproject.toml标准。 - ❌ 部分 IDE 需要额外配置才能识别 PEP 582 模式。
安装
# macOS / Linux(推荐)
curl -sSL https://pdm-project.org/install-pdm.py | python3 -
# Windows(PowerShell)
(Invoke-WebRequest -Uri 'https://pdm-project.org/install-pdm.py' -UseBasicParsing).Content | python -
# Homebrew(macOS)
brew install pdm
# pip 安装
pip install pdm项目初始化
| 命令 | 说明 |
|---|---|
pdm init | 初始化项目(交互式) |
pdm init -n | 非交互式初始化(使用默认值) |
依赖管理
| 命令 | 说明 |
|---|---|
pdm install | 安装 pyproject.toml 中的所有依赖 |
pdm add requests | 添加依赖 |
pdm add requests==2.31.0 | 添加指定版本 |
pdm add -dG test pytest | 添加分组依赖 |
pdm remove requests | 移除依赖 |
pdm update | 更新所有依赖 |
pdm update requests | 更新指定依赖 |
pdm list | 列出已安装的所有包 |
pdm list --graph | 树形展示依赖关系 |
pdm export -o requirements.txt | 导出为 requirements.txt |
pdm import requirements.txt | 从 requirements.txt 导入 |
pdm lock | 重新生成 pdm.lock |
虚拟环境管理
| 命令 | 说明 |
|---|---|
pdm use python3.11 | 切换虚拟环境的 Python 版本 |
pdm use -f auto | 自动检测可用的 Python |
pdm venv list | 列出所有虚拟环境 |
pdm venv create 3.11 | 创建指定版本的虚拟环境 |
pdm venv remove | 删除虚拟环境 |
pdm info | 查看当前环境信息 |
pdm run python main.py | 在虚拟环境中执行命令 |
打包与发布
| 命令 | 说明 |
|---|---|
pdm build | 构建分发包 |
pdm publish | 发布到 PyPI |
pdm publish --repository testpypi | 发布到 TestPyPI |
Rye(2023)
由 Astral 公司开发(也是 uv 的创造者),用 Rust 编写。它使用与 uv 相同的支持库解析器,定位为 Poetry 的极速替代品。Rye 团队后续已并入 uv 团队。
安装
# macOS / Linux
curl -sSf https://rye-up.com/install | bash
# Homebrew
brew install rye常用命令
# 初始化 Rye
rye init
# 添加依赖
rye add requests
# 同步依赖
rye sync
# 运行项目
rye run python main.py
# 锁定依赖
rye lock
# 配置 Python 版本
rye config --set-default python=3.11uv(2024 · ⭐ 当前最推荐)
由 Astral 公司用 Rust 编写的新一代一体化工具,目标是取代 pip、venv、pyenv、pip-tools、pipx、poetry 等多个工具。
性能对比
| 工具 | 冷启动 | 热启动 |
|---|---|---|
pip | 32.1 s | 28.7 s |
Poetry | 11.4 s | 9.2 s |
uv | 0.5 s | 0.02 s |
uv比pip快 10~100 倍。uv比Poetry快 2~10 倍。
特点
- ✅ 极致性能(Rust 原生实现)。
- ✅ 一体化:集成
pyenv、venv、pip、poetry、pipx等功能。 - ✅ 兼容
pip命令(uv pip可直接替代pip)。 - ✅ 兼容
pyproject.toml和requirements.txt。 - ❌ 不支持非 Python 依赖(如 CUDA、MKL 等需用 Conda)。
安装
# macOS / Linux(一键安装脚本)
curl -LsSf https://astral.sh/uv/install.sh | sh
# macOS(Homebrew)
brew install uv
# Windows(PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
# pip 安装
pip install uv
# 查看版本
uv --versionPython 版本管理(替代 pyenv)
| 命令 | 说明 |
|---|---|
uv python install 3.12 | 安装指定 Python 版本 |
uv python install 3.11 3.12 | 同时安装多个版本 |
uv python list | 列出所有可用的 Python 版本 |
uv python list --only-installed | 仅列出已安装的版本 |
uv python find | 查找系统默认的 Python |
uv python find 3.11 | 查找指定版本的 Python |
uv python uninstall 3.10 | 卸载指定版本 |
uv python pin 3.11 | 在项目中固定 Python 版本 |
包管理(替代 pip)
| 命令 | 说明 |
|---|---|
uv pip install requests | 安装包 |
uv pip install -r requirements.txt | 批量安装 |
uv pip install -e . | 可编辑模式安装 |
uv pip install --upgrade requests | 升级包 |
uv pip uninstall requests | 卸载包 |
uv pip list | 列出已安装包 |
uv pip freeze | 输出 requirements 格式 |
uv pip show requests | 查看包信息 |
uv pip compile requirements.in -o requirements.txt | 锁定依赖(替代 pip-compile) |
uv pip sync requirements.txt | 同步环境(替代 pip-sync) |
虚拟环境(替代 venv/virtualenv)
| 命令 | 说明 |
|---|---|
uv venv | 在当前目录创建 .venv |
uv venv myenv | 创建名为 myenv 的虚拟环境 |
uv venv --python 3.11 | 指定 Python 版本 |
uv venv --seed | 预装 pip 等种子包 |
项目管理(替代 poetry)
| 命令 | 说明 |
|---|---|
uv init myproject | 初始化新项目 |
uv init --lib myproject | 初始化库项目(含 src/ 布局) |
uv init --package myproject | 初始化可发布的包项目 |
uv init --bare | 仅生成最小化配置 |
uv add requests | 添加依赖 |
uv add --dev pytest | 添加开发依赖 |
uv add "requests>=2.31" | 添加版本范围 |
uv add git+https://github.com/xxx/yyy.git | 从 Git 仓库添加 |
uv remove requests | 移除依赖 |
uv sync | 同步项目依赖 |
uv sync --frozen | 不更新 lock,直接按 lock 安装 |
uv lock | 生成 / 更新 uv.lock |
uv lock --upgrade | 升级所有依赖 |
uv lock --upgrade-package requests | 升级指定包 |
uv tree | 显示依赖树 |
uv run main.py | 在虚拟环境中运行脚本 |
uv run pytest | 在虚拟环境中运行测试 |
uv build | 构建分发包 |
uv publish | 发布到 PyPI |
CLI 工具管理(替代 pipx)
| 命令 | 说明 |
|---|---|
uv tool install black | 全局安装 CLI 工具 |
uv tool run black . | 运行 CLI 工具(无需预先安装) |
uv tool list | 列出已安装的 CLI 工具 |
uv tool upgrade black | 升级 CLI 工具 |
uv tool uninstall black | 卸载 CLI 工具 |
缓存管理
| 命令 | 说明 |
|---|---|
uv cache info | 查看缓存信息 |
uv cache list | 列出缓存内容 |
uv cache clean | 清空缓存 |
uv cache prune | 清理过期缓存 |
五、科学计算环境(Conda 系)
对于数据科学、深度学习等需要 CUDA、MKL、cuDNN 等非 Python 依赖的场景,纯 Python 包管理工具往往力不从心,此时可以使用 Conda 系 工具。
Conda(2012)
关于 Anaconda
conda 命令本身是开源且免费的(BSD 许可),但 Anaconda 发行版(预装了大量科学计算包)对企业商用收费。个人学习、学术研究可免费使用。
安装
# 推荐安装 Miniforge(轻量、开源、conda-forge 默认源)
# macOS / Linux
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
# Windows
# 从 https://github.com/conda-forge/miniforge 下载安装包环境管理
| 命令 | 说明 |
|---|---|
conda create -n myenv python=3.11 | 创建指定 Python 版本的虚拟环境 |
conda create -n myenv python=3.11 numpy | 创建环境并预装包 |
conda activate myenv | 激活虚拟环境 |
conda deactivate | 退出虚拟环境 |
conda env list | 列出所有虚拟环境 |
conda info --envs | 同上 |
conda remove -n myenv --all | 删除整个虚拟环境 |
conda rename -n oldenv newenv | 重命名虚拟环境 |
conda env export > environment.yml | 导出环境配置 |
conda env create -f environment.yml | 从文件创建环境 |
conda env update -f environment.yml | 更新已有环境 |
包管理
| 命令 | 说明 |
|---|---|
conda install numpy | 安装包 |
conda install numpy=1.24 | 安装指定版本 |
conda install -n myenv numpy | 在指定环境中安装包 |
conda update numpy | 升级包 |
conda update --all | 升级所有包 |
conda remove numpy | 卸载包 |
conda list | 列出当前环境的包 |
conda list -n myenv | 列出指定环境的包 |
conda search numpy | 搜索可用包 |
conda install -c conda-forge numpy | 从 conda-forge 源安装 |
配置管理
# 查看所有配置
conda config --show
# 添加镜像源(清华源)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes
# 恢复默认源
conda config --remove-key channels缓存管理
| 命令 | 说明 |
|---|---|
conda clean --all | 清理所有缓存(索引缓存、压缩包、未使用包等) |
conda clean -i | 仅清理索引缓存 |
conda clean -p | 仅清理未使用的包 |
Mamba(2019)
Mamba 是用 C++ 重写的 Conda 替代品,特点是多线程下载和使用 libsolv 进行极速依赖解析。
# 永久将 conda 命令替换为 mamba(添加到 ~/.bashrc / ~/.zshrc)
alias conda=mamba
# 用法与 conda 完全一致
mamba create -n myenv python=3.11
mamba install numpyMiniforge(2020)
Miniforge 是一个轻量级的 Conda 发行版,默认使用社区维护的 conda-forge 源,避免了 Anaconda 的臃肿和企业授权问题。个人用户首选。
# 安装后,所有 conda 命令即为 miniforge 的命令
conda --version
conda config --show channels # 默认 channels 应为 conda-forgePixi(2024)
由 Prefix.dev 开发,基于 Rust 编写的 rattler 解析器。2024 年 2 月将后端替换为 uv,提供自定义锁文件,适合需要同时混合 PyPI 和 conda-forge 源的复杂场景。
安装
# macOS / Linux
curl -fsSL https://pixi.sh/install.sh | bash
# Windows(PowerShell)
iwr -useb https://pixi.sh/install.ps1 | iex
# Homebrew
brew install pixi常用命令
# 初始化项目
pixi init myproject
# 添加 PyPI 依赖
pixi add requests
# 添加 conda 依赖
pixi add --feature cuda cuda
# 安装所有依赖
pixi install
# 在环境中执行命令
pixi run python main.py
# 锁定依赖
pixi lock
# 更新依赖
pixi update六、依赖分析工具
pip-tools(2013)
通过 pip-compile 从 requirements.in 生成带有哈希校验的 requirements.txt,并用 pip-sync 同步环境。
# 安装
pip install pip-tools
# 从 requirements.in 编译生成 requirements.txt
pip-compile requirements.in
# 升级所有包到最新版
pip-compile --upgrade requirements.in
# 升级指定包
pip-compile --upgrade-package requests requirements.in
# 指定输出文件
pip-compile requirements.in -o requirements-dev.txt
# 同步环境(多余包会被卸载,缺少包会被安装)
pip-sync requirements.txtpipreqs(2016)
通过扫描项目源码中的 import 语句,自动生成 requirements.txt,适合梳理老项目的依赖。
# 安装
pip install pipreqs
# 在项目目录下生成 requirements.txt
pipreqs /project --ignore node_modules --encoding=utf8
# 强制覆盖已有文件
pipreqs /project --force
# 仅打印到标准输出(不写文件)
pipreqs /project --print
# 自定义保存路径
pipreqs /project --savepath deps/requirements.txt
# 同时保存包所在位置信息(pigar 风格)
pipreqs /project --pigar-mode注意
无法识别动态导入(如 importlib.import_module()),需要手动补充。
pigar(2018)
通过 AST 解析 Python 源码,不仅能识别依赖,还能标注每个依赖被引用的具体位置。
# 安装
pip install pigar
# 生成 requirements.txt,并标注依赖引用位置
pigar -p /project -o requirements.txt
# 不输出推荐版本(仅列出实际使用的包)
pigar -p /project --without-recommends
# 生成指定格式的报告
pigar -p /project -o requirements.txt --format txtpipdeptree(2015)
以树形结构展示项目依赖关系,并可检测版本冲突。
# 安装
pip install pipdeptree
# 查看依赖树
pipdeptree
# 反向展示(谁依赖了这个包)
pipdeptree --reverse --packages requests
# 仅展示指定包
pipdeptree --packages requests,flask
# 排除指定包
pipdeptree --exclude pip,setuptools
# 检测版本冲突
pipdeptree --warn conflict
# 配合 grep 找出具体冲突
pipdeptree --warn conflict | grep "version conflict"
# 输出为 JSON 格式
pipdeptree --json
# 输出为 requirements.txt 格式
pipdeptree --freeze七、时间简史
包管理与虚拟环境的演进时间线:
2000s setuptools / easy_install
│
2008 pip + virtualenv
│
2012 venv(Python 3.3 内置) ──── 2012 Conda
│
2013 pip-tools ──── 2015 pipdeptree
│
2014 pyenv ──── 2016 pipreqs
│
2017 Pipenv ──── 2018 pigar
│
2018 Poetry
│
2019 Mamba
│
2020 PDM ──── 2020 Miniforge
│
2023 Rye
│
2024 uv(Rye 团队并入 uv) ──── 2024 Pixi八、选型建议(2025+)
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 初学者 / 学习 | pip + venv | 官方标配,简单直观 |
| 库开发者 / 开源项目 | Poetry | 依赖解析稳定,打包发布完善 |
| 数据科学 / 深度学习 | Conda(Miniforge) | 需要 CUDA、MKL 等非 Python 依赖 |
| PyPI + Conda 混合 | Pixi | 跨源统一管理 |
| Python 2 老项目 | virtualenv | 唯一兼容 Python 2 的现代工具 |
| 重构 / 分析老项目 | pipreqs + pipdeptree | 自动梳理依赖 + 检测冲突 |
| 新项目(默认推荐) | uv ⭐ | 速度快、功能全、生态活跃 |
九、未来趋势
- Rust 工具链主导:
uv、Pixi等 Rust 编写的工具在性能上有压倒性优势,未来生态将进一步向 Rust 工具迁移。 pyproject.toml标准趋同:PEP 621 等标准不断完善,各工具的配置格式将逐步统一。- AI 辅助解决版本冲突:未来可能出现基于 LLM 的依赖冲突自动修复工具。
- 与容器化深度融合:虚拟环境与 Docker 的边界逐渐模糊,两者协同使用将成为主流。
总结
一句话总结
- 简单项目:
pip + venv。 - 复杂项目:
uv或Poetry。 - 数据科学:
Conda(Miniforge)。 - 老项目维护:
virtualenv+pipreqs + pipdeptree。
选择工具的关键不在于"哪个最强",而在于"哪个最适合当前项目和团队"。
