引言:为什么需要虚拟环境?
Python 项目的依赖管理一直是开发者面临的经典难题。你是否有过这样的经历:项目 A 需要 Django 3.2,项目 B 需要 Django 4.2,而系统全局只装了一个版本?或者你升级了一个包,却发现另一个项目因此崩溃?
虚拟环境正是为了解决这些问题而生的。它为每个项目创建独立的 Python 运行环境,隔离不同项目的依赖,从而避免版本冲突。
虚拟环境的核心概念
我们先理解虚拟环境的核心机制:
- 隔离的 Python 解释器每个虚拟环境有自己独立的
python 可执行文件 - 独立的
site-packages 目录 - 可激活的环境通过激活脚本修改
PATH 环境变量,让当前 shell 优先使用虚拟环境的 Python
全局 Python├── /usr/bin/python3└── /usr/local/lib/python3.14/site-packages/项目 A 虚拟环境├── /projects/a/.venv/bin/python└── /projects/a/.venv/lib/python3.14/site-packages/项目 B 虚拟环境├── /projects/b/.venv/bin/python└── /projects/b/.venv/lib/python3.14/site-packages/
venv——Python 内置的虚拟环境工具
从 Python 3.3 开始,venv 模块成为标准库的一部分,是官方推荐的虚拟环境创建方式(Python 3.5 之前使用 pyvenv,现已废弃)。它轻量、简单,无需额外安装。
1. 创建虚拟环境
python -m venv .venv
venv 会在当前目录下创建一个名为 .venv 的文件夹,包含一份独立的 Python 环境。
💡 命名约定:通常使用 .venv、venv 或 env。.venv 更常见,因为点开头在 Unix 系统中默认隐藏,不易被误删除。
2. 激活虚拟环境
| |
|---|
| Windows (CMD) | .venv\Scripts\activate.bat |
| Windows (PowerShell) | .venv\Scripts\Activate.ps1 |
| macOS / Linux | source .venv/bin/activate |
激活后,终端提示符会显示 (.venv) 前缀,表示当前处于虚拟环境中。
(.venv) user@host:~$
3. 管理依赖
# 安装包pip install requests# 导出依赖列表pip freeze > requirements.txt# 从 requirements.txt 安装pip install -r requirements.txt
4. 退出虚拟环境
deactivate
5. 删除虚拟环境
直接删除 .venv 文件夹即可。
rm -rf .venv
venv 的优缺点
| |
|---|
| ❌ 默认只管理 Python 包,不管理 Python 版本 |
| |
| ❌ 跨平台兼容性略有差异(Windows 激活脚本需要调整执行策略) |
| |
virtualenv——venv 的前辈与补充
virtualenv 是 venv 的前身,诞生于 Python 3.3 之前。它功能更丰富,但目前已不再是推荐首选(venv 已覆盖其主要用途)。
# 安装pip install virtualenv# 创建虚拟环境virtualenv .venv# 激活方式与 venv 相同source .venv/bin/activate
virtualenv 依然在某些场景中有用:
- 需要更细粒度的控制(如自定义 Python 解释器路径)
- 某些 CI/CD 环境可能预装了
virtualenv 而非 venv
⚠️ 新项目建议使用 venv,除非有明确理由需要 virtualenv 的额外功能。
conda——科学计算的“瑞士军刀”
conda 是 Anaconda 发行版自带的包和环境管理器,尤其流行于数据科学和机器学习领域。它不仅能管理 Python 包,还能管理不同版本的 Python 解释器本身,以及非 Python 的二进制依赖(如 CUDA、OpenBLAS)。
1. 安装 conda
推荐安装 Miniconda(轻量版,只包含 conda 和 Python),而非完整的 Anaconda(预装大量包)。
# 下载 Miniconda 安装脚本(Linux)wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash Miniconda3-latest-Linux-x86_64.sh
2. 创建环境
# 创建名为 myenv 的环境,指定 Python 3.11conda create -n myenv python=3.11# 创建时同时安装包conda create -n myenv python=3.11 numpy pandas
3. 激活环境
conda activate myenv
4. 管理包
# 安装包(优先从 conda 官方渠道)conda install requests# 从 conda-forge 渠道安装(更丰富的包)conda install -c conda-forge scikit-learn# 当 conda 中找不到时,使用 pip 安装(混合模式)pip install some-package# 导出环境(两种格式)conda envexport > environment.yml # 完整导出(含平台信息)conda envexport --from-history > environment.yml # 只导出手动安装的包(推荐)# 从 environment.yml 创建环境conda env create -f environment.yml
5. 查看所有环境
conda env list
6. 删除环境
conda env remove -n myenv
conda 的优缺点
| |
|---|
| |
| |
| |
| ❌ 许可证费用(Anaconda 商业版有费用,Miniconda 免费) |
Poetry——依赖管理与打包的现代方案
Poetry 是一个集依赖管理、虚拟环境、打包发布于一体的现代工具。它使用 pyproject.toml 作为配置文件,替代传统的 requirements.txt 和 setup.py。
1. 安装 Poetry
# 官方安装方式(推荐)curl -sSL https://install.python-poetry.org | python3 -# 或通过 pip(不推荐,可能产生依赖冲突)pip install poetry
2. 初始化项目
poetry new myproject # 创建新项目(含目录结构)poetry init # 在现有项目中初始化 pyproject.toml
3. 管理虚拟环境
# 创建并激活环境(自动)poetry shell# 或在新 shell 中激活poetry run python script.py# 查看当前环境信息poetry env info
4. 管理依赖
# 添加依赖poetry add requests# 添加开发依赖poetry add --dev pytest# 安装所有依赖(从 pyproject.toml)poetry install# 更新依赖poetry update
5. 导出 requirements.txt(兼容旧项目)
poetry export -f requirements.txt --output requirements.txt
Poetry 的优缺点
| |
|---|
| |
✅ 统一的项目配置(pyproject.toml) | |
| |
| ❌ 与企业内部 Artifactory 集成稍复杂 |
uv——用 Rust 写的极速替代品
uv 是 Astral 公司(Flake8 团队)推出的新一代 Python 包管理器,用 Rust 编写,旨在替代 pip 和 poetry 的核心功能。它被誉为“Python 的 Cargo”。
1. 安装 uv
# 独立安装(推荐)curl -LsSf https://astral.sh/uv/install.sh | sh# 或通过 pip(需要 Python 3.8+)pip install uv# 验证uv --version
2. 创建虚拟环境(与 venv 兼容)
# 创建虚拟环境(兼容 venv 目录结构)uv venv .venv# 激活方式与 venv 相同source .venv/bin/activate
3. 管理依赖(极速)
# 安装包(比 pip 快 10-100 倍)uv pip install requests# 从 requirements.txt 安装uv pip install -r requirements.txt# 导出依赖uv pip freeze > requirements.txt
4. 项目管理(类似 poetry)
# 初始化项目uv init myproject# 添加依赖uv add requests# 添加开发依赖uv add --dev pytest# 安装所有依赖uv sync# 运行脚本uv run python script.py
5. 与其他工具集成
uv 兼容 pip 和 poetry 的工作流,可以无缝替代它们:
# 用 uv 替代 pip installalias pip="uv pip"# 使用 uv 作为 Poetry 的后端poetry config experimental.new-installer falsepoetry config experimental.use-uv true
uv 的优缺点
工具对比与选型指南
| | |
|---|
| venv | | |
| conda | | 管理 Python 版本和二进制依赖、适合多版本项目 |
| Poetry | | |
| uv | | 极快、兼容 pip/poetry 工作流、Rust 实现 |
| pipenv | | |
场景化推荐
- 新手学习
- Web 开发(Django/Flask)推荐
Poetry 或 uv,便于管理依赖版本和锁定。 - 数据科学(NumPy/Pandas)推荐
conda,因为它处理非 Python 依赖更可靠。 - 跨平台 CLI 工具
- 追求极致开发体验
总结
无论选择哪种工具,以下几点通用建议可以帮助你避免常见陷阱:
- 始终使用虚拟环境即使是个人实验项目,也建议创建虚拟环境,避免污染全局。
- 将虚拟环境目录加入
.gitignore - 锁定依赖版本使用
pip freeze > requirements.txt、poetry lock 或 uv lock 记录精确版本,确保可重现构建。 - 分离开发与生产依赖使用
--dev 标记开发依赖(如测试、lint 工具)。 - 定期更新依赖
- 避免混合使用多个包管理器尽量不要在 conda 环境中使用 pip 安装大量包,也不要在 Poetry 项目中直接调用 pip。
本期小结
今天我们全面梳理了 Python 虚拟环境的主流工具:
| | |
|---|
| venv | python -m venv .venv | |
| virtualenv | virtualenv .venv | |
| conda | conda create -n env python=3.x | |
| Poetry | poetry init | |
| uv | uv venv | |
个人建议:初学者简单的个人项目直接使用 venv ,Web 开发用 Poetry 或 uv,数据科学用 conda。
注意:使用开发工具时要跟据项目检查虚拟环境是否正确。使用命令行编译注意看是否进入了虚拟环境。不然就是全局环境了。要注意!