virtualenv
virtualenv 是 Python 虚拟环境管理工具,用于创建隔离的 Python 运行环境。Python 3 内置了轻量级的 venv 模块。
#resource
#evergreen
#python
#python
[!info] related notes
- 所属 MOC: Python MOC, 开发环境 MOC
- 前置概念: python
- 并列概念: poetry, uv
- 关系笔记: python-package-management-evolution
virtualenv
本页以第三方 virtualenv 为工具对象,并保留标准库 venv 的对照与操作入口;历史别名 venv 用于兼容旧链接,不表示二者是同一实现。
一句话定义
virtualenv 是 Python 的虚拟环境管理工具,用于创建隔离的 Python 运行环境,避免全局包冲突。Python 3 内置了轻量级的 venv 模块。
核心内容
解决什么问题
若不同项目向同一环境安装不兼容依赖,会发生版本冲突:
- 项目 A 需要 Django 3
- 项目 B 需要 Django 4
- 两者无法共存
核心功能
只做一件事:创建纯净、隔离的 Python 运行环境
不做什么:
- 不定义项目依赖契约;可搭配 pip、生成的 requirements 或上层项目工具
- 不锁定版本(没有 lock 文件机制)
- 不管理 Python 版本
virtualenv vs venv
| 特性 | virtualenv | venv (内置) |
|---|---|---|
| 安装 | 第三方包/工具 | Python 3.3+ 标准库(部分发行版需安装 venv 系统包) |
| 功能 | 更丰富,支持更多选项 | 轻量级,基础功能 |
| 速度 | 受种子包缓存与配置影响 | 受 ensurepip 与平台影响;需在同条件下测量 |
| 推荐 | 需要高级功能时 | 大多数场景 |
最小例子
使用 venv(推荐)
# 创建虚拟环境
python -m venv myenv
# 激活虚拟环境
# Unix/macOS
source myenv/bin/activate
# Windows PowerShell 用 .\myenv\Scripts\Activate.ps1
# Windows cmd 用 myenv\Scripts\activate.bat
# 在虚拟环境中安装包
python -m pip install requests
# 退出虚拟环境
deactivate
使用 virtualenv
# 安装 virtualenv
pip install virtualenv
# 创建虚拟环境
virtualenv myenv
# 指定 Python 版本
virtualenv -p /usr/bin/python3.12 myenv # 路径须已存在
# 激活和退出同上
不必激活也可直接调用 myenv/bin/python(Windows 为 myenv\Scripts\python.exe)。激活主要调整当前 shell 的 PATH,不是进程/权限隔离。环境通常不可直接跨机器搬运,应从依赖契约重建。
依赖管理(手动)
# 导出依赖
python -m pip freeze > requirements.txt
# 安装依赖
python -m pip install -r requirements.txt
常用命令速查
| 命令 | 作用 |
|---|---|
python -m venv myenv | 创建虚拟环境(venv) |
virtualenv myenv | 创建虚拟环境(virtualenv) |
virtualenv -p python3.12 myenv | 选择已可用的解释器 |
source myenv/bin/activate | 激活(Unix/macOS) |
.\myenv\Scripts\Activate.ps1 | 激活(PowerShell) |
myenv\Scripts\activate.bat | 激活(cmd) |
deactivate | 退出虚拟环境 |
python -m pip freeze > requirements.txt | 导出依赖 |
python -m pip install -r requirements.txt | 安装依赖 |
rm -rf myenv | 删除虚拟环境 |
边界与易混淆点
局限性
- 环境工具本身不求解/锁定项目依赖,可与锁定工具配合使用
- pip freeze 是已安装环境的清单,不记录完整求解意图、所有平台条件或制品哈希
- 默认隔离项目 site-packages,但仍共享系统资源;不是安全沙箱
不是
- 不是包管理器:只隔离环境,不管理依赖
- 不是 Poetry/uv 的替代品:功能更简单,适合简单场景
- 不是 Python 版本管理器:不能安装不同版本的 Python
最佳实践
- 每个项目一个虚拟环境
- 使用
venv而非virtualenv(除非需要高级功能) - 配合
requirements.txt管理依赖 - 将虚拟环境目录加入
.gitignore
适用场景
- ✅ 简单的单文件脚本
- ✅ 学习和实验
- ✅ 不需要依赖锁定的项目
- ✅ 已有成熟项目使用 requirements.txt
- 需要严格锁定时搭配依赖锁定流程;发布库可另用构建/发布工具
- 新项目也可使用,是否采用 Poetry/uv 取决于需要整合哪些职责
参考:venv、virtualenv、pip freeze。