Skip to content

虚拟环境与依赖管理

概述

在 Python 项目开发中,包管理虚拟环境是两个不同维度的概念,但又紧密相关:

  • 包管理:负责包的安装、更新、卸载等操作(如 pippoetryuv pip)。
  • 虚拟环境:负责为每个项目隔离依赖,避免项目之间的包版本冲突(如 venvvirtualenvuv venv)。

为什么要使用虚拟环境?

  1. 依赖隔离:不同项目可能依赖同一个包的不同版本,虚拟环境可以让每个项目拥有自己独立的依赖。
  2. 环境可复现:通过锁文件(如 poetry.lockuv.lock)可以精确还原项目环境。
  3. 避免污染全局环境:把所有的包都安装在全局环境,会让全局环境变得臃肿且难以维护。
  4. 便于协作:团队成员可以通过虚拟环境配置,快速获得一致的开发环境。

一、包管理工具

pip(官方 · 2008)

pip 是 Python 官方推荐的包管理工具,提供了对 Python 包的查找、下载、安装、卸载等功能。它是所有现代包管理工具的底层引擎

优点与缺点

优点

  • Python 官方维护,稳定可靠。
  • 免安装即用(Python 3.4+ 内置)。
  • 生态最完整,几乎所有第三方包都支持。

缺点

  • 无依赖冲突解决能力(只能按顺序安装,依赖冲突时容易出问题)。
  • 无环境隔离功能(默认安装到全局环境)。

安装与升级

bash
# 升级 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 freezerequirements.txt 格式输出所有已安装包
pip freeze > requirements.txt导出到文件
pip freeze --local仅导出当前虚拟环境的包(不含全局)

镜像源配置

bash
# 临时使用(仅本次命令生效)
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 取代,新项目不再推荐使用。

安装

bash
# 通过 pip 安装
pip install virtualenv

# 查看版本
virtualenv --version

创建虚拟环境

命令说明
virtualenv myenv创建名为 myenv 的虚拟环境
virtualenv -p python3.11 myenv指定 Python 解释器版本
virtualenv --system-site-packages myenv允许访问全局已安装的包
virtualenv --no-seed myenv不预装 pipsetuptoolswheel
virtualenv --clear myenv如果存在则先清空再创建
virtualenv --relocatable myenv创建可重定位的虚拟环境

激活与退出

bash
# Windows(CMD)
myenv\Scripts\activate.bat

# Windows(PowerShell)
myenv\Scripts\Activate.ps1

# macOS / Linux
source myenv/bin/activate

# 退出虚拟环境(任意系统)
deactivate

venv(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 可执行文件而非符号链接

激活与退出

bash
# 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)。
  • ❌ 不管理依赖,需搭配 venvpipenvpoetry 使用。

安装

bash
# 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 --listgrep "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)

bash
# 安装插件
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 开发工作流的未来"。它引入了 PipfilePipfile.lock 两个文件,分别用于声明依赖和锁定版本。

现状

社区活跃度近年明显下降,依赖解析速度较慢,新项目不建议使用

安装

bash
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 官方推荐的项目配置标准。
  • ❌ 上手成本略高。
  • ❌ 依赖解析在大型项目中可能较慢。
  • ❌ 部分细节(如全局镜像源设置)配置不够友好。

安装

bash
# 官方安装脚本(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配置不自动创建虚拟环境

配置管理

bash
# 查看所有配置
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 模式。

安装

bash
# 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.txtrequirements.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 团队。

安装

bash
# macOS / Linux
curl -sSf https://rye-up.com/install | bash

# Homebrew
brew install rye

常用命令

bash
# 初始化 Rye
rye init

# 添加依赖
rye add requests

# 同步依赖
rye sync

# 运行项目
rye run python main.py

# 锁定依赖
rye lock

# 配置 Python 版本
rye config --set-default python=3.11

uv(2024 · ⭐ 当前最推荐)

由 Astral 公司用 Rust 编写的新一代一体化工具,目标是取代 pipvenvpyenvpip-toolspipxpoetry 等多个工具。

性能对比

工具冷启动热启动
pip32.1 s28.7 s
Poetry11.4 s9.2 s
uv0.5 s0.02 s
  • uvpip10~100 倍
  • uvPoetry2~10 倍

特点

  • ✅ 极致性能(Rust 原生实现)。
  • ✅ 一体化:集成 pyenvvenvpippoetrypipx 等功能。
  • ✅ 兼容 pip 命令(uv pip 可直接替代 pip)。
  • ✅ 兼容 pyproject.tomlrequirements.txt
  • ❌ 不支持非 Python 依赖(如 CUDA、MKL 等需用 Conda)。

安装

bash
# 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 --version

Python 版本管理(替代 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 发行版(预装了大量科学计算包)对企业商用收费。个人学习、学术研究可免费使用。

安装

bash
# 推荐安装 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 源安装

配置管理

bash
# 查看所有配置
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 进行极速依赖解析

bash
# 永久将 conda 命令替换为 mamba(添加到 ~/.bashrc / ~/.zshrc)
alias conda=mamba

# 用法与 conda 完全一致
mamba create -n myenv python=3.11
mamba install numpy

Miniforge(2020)

Miniforge 是一个轻量级的 Conda 发行版,默认使用社区维护的 conda-forge 源,避免了 Anaconda 的臃肿和企业授权问题。个人用户首选

bash
# 安装后,所有 conda 命令即为 miniforge 的命令
conda --version
conda config --show channels   # 默认 channels 应为 conda-forge

Pixi(2024)

由 Prefix.dev 开发,基于 Rust 编写的 rattler 解析器。2024 年 2 月将后端替换为 uv,提供自定义锁文件,适合需要同时混合 PyPI 和 conda-forge 源的复杂场景。

安装

bash
# macOS / Linux
curl -fsSL https://pixi.sh/install.sh | bash

# Windows(PowerShell)
iwr -useb https://pixi.sh/install.ps1 | iex

# Homebrew
brew install pixi

常用命令

bash
# 初始化项目
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-compilerequirements.in 生成带有哈希校验requirements.txt,并用 pip-sync 同步环境。

bash
# 安装
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.txt

pipreqs(2016)

通过扫描项目源码中的 import 语句,自动生成 requirements.txt,适合梳理老项目的依赖。

bash
# 安装
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 源码,不仅能识别依赖,还能标注每个依赖被引用的具体位置

bash
# 安装
pip install pigar

# 生成 requirements.txt,并标注依赖引用位置
pigar -p /project -o requirements.txt

# 不输出推荐版本(仅列出实际使用的包)
pigar -p /project --without-recommends

# 生成指定格式的报告
pigar -p /project -o requirements.txt --format txt

pipdeptree(2015)

树形结构展示项目依赖关系,并可检测版本冲突

bash
# 安装
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

七、时间简史

plain
包管理与虚拟环境的演进时间线:

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 工具链主导uvPixi 等 Rust 编写的工具在性能上有压倒性优势,未来生态将进一步向 Rust 工具迁移。
  • pyproject.toml 标准趋同:PEP 621 等标准不断完善,各工具的配置格式将逐步统一。
  • AI 辅助解决版本冲突:未来可能出现基于 LLM 的依赖冲突自动修复工具。
  • 与容器化深度融合:虚拟环境与 Docker 的边界逐渐模糊,两者协同使用将成为主流。

总结

一句话总结

  • 简单项目:pip + venv
  • 复杂项目:uvPoetry
  • 数据科学:Conda(Miniforge)。
  • 老项目维护:virtualenv + pipreqs + pipdeptree

选择工具的关键不在于"哪个最强",而在于"哪个最适合当前项目和团队"。