1. 什么是虚拟环境,为什么需要它?
举一个不恰当的例子:老渣的微信里面有同事,同学还有小美 ABCDE,某天给妹子发“宝贝晚安”消息时误发给了同事……部分原因是因为用一个微信处理不同的场景导致容易出错。这件事情后,老渣的解决方法也很简单,就是微信多开,再创建一个号,账号数据独立,工作生活两不误。
话说回来,当我们开发项目时,如果共用环境也容易出现问题,那么创建独立的环境就能很好的解决问题。
1.1. 虚拟环境
Python 虚拟环境(Virtual Environment)是一个独立隔离的 Python 运行环境,它允许你在不同项目中使用不同的 Python 版本和依赖库,而不会相互影响。
1.2. 虚拟环境的作用
1. 避免依赖冲突
- 不同项目可能需要不同版本的库。例如: A 项目依赖
Django 2.x,B 项目依赖Django 4.x - 直接在系统环境安装多个版本的库,容易导致兼容性问题,而虚拟环境可以让每个项目独立运行所需的版本。
2. 防止污染全局环境
- 如果所有 Python 项目都共用一个全局环境,安装或卸载某个库可能影响其他项目的运行。
- 使用虚拟环境,每个项目的依赖都在自己的目录中,不会污染全局 Python 目录。
3. 保持项目的可移植性
- 在团队协作或部署到服务器时,使用
requirements.txt或pyproject.toml记录所有依赖,其他人可以用虚拟环境安装相同的依赖,保证代码能在不同环境下运行一致。
4. 兼容不同 Python 版本
- 你可以在同一台电脑上运行 Python 3.8、3.10 或 3.12,而不会互相干扰。
1.3. 虚拟环境原理
虚拟环境的本质是路径隔离系统,通过三层隔离机制实现环境独立
这三层隔离机制分别是:
1. Python解释器路径隔离:虚拟环境中的python可执行文件本质是原解释器的符号链接(硬链接),激活环境时通过修改PATH环境变量优先指向虚拟环境路径
2. 依赖包路径隔离:通过重写sys.path列表,优先加载虚拟环境的site-packages目录,全局site-packages成为备用搜索路径
3. 环境变量隔离:修改PYTHONPATH、PYTHONHOME等关键变量,确保Python运行时仅感知当前环境配置
1.4. 虚拟环境的主流方案
我们有多种方式可以实现 python 的虚拟环境,下面是几种常见的类型:
1.4.1. 官方标准方案(venv)
Python 官方提供的 venv 方案十分好用,而且Python 3.3 以上版本自带 venv, 我们大多数情况下直接使用本方案即可。
特点:
- 基于
sysconfig模块生成标准化环境结构 - 通过
pyvenv.cfg配置文件声明隔离策略 - 完全依赖Python标准库实现
- 轻量级环境管理的行业标准
简单示例:
# 创建环境
python -m venv myenv
# 激活环境
# Windows
myenv\Scripts\activate
# Mac/Linux
source myenv/bin/activate
# 退出环境
deactivate
1.4.2. Virtualenv(经典第三方方案)
Virtualenv 是 Python 最早的虚拟环境工具,通过创建独立的 Python 运行环境,解决项目依赖冲突问题。
特点:
- 首创
activate/deactivate环境切换机制 - 支持多Python版本共存(通过
--python参数) - 引入
relocatable可迁移环境特性 - 仍广泛用于遗留Python 2项目
- 逐步被venv替代
1.4.3. Conda环境(Anaconda生态核心)
如果你安装的 IDE 是 Anaconda,而且代码多用于科学计算,那么用 Conda 就对了。
特点:
- 跨语言依赖管理(Python/R/C++库统一管理)
- 采用SAT求解器实现依赖冲突智能解析
- 基于二进制包缓存加速环境构建
- 数据科学领域事实标准
1.4.4. 现代集成方案(Pipenv/Poetry)
Pipenv 和 Poetry 是新一代 Python 依赖管理工具,将虚拟环境和包管理功能整合,提供更现代、更高效的开发体验。
特点:
- 将虚拟环境与依赖管理深度整合
- 引入
Pipfile/poetry.lock声明式依赖规范 - 支持依赖解析的确定性构建
- 逐步成为Web开发领域新标准
1.4.5. 工具对比
|
工具 |
特点 |
适用场景 |
|
venv |
Python 3.3+内置,无需安装 |
基础隔离需求,官方推荐 |
|
virtualenv |
兼容Python 2/3,功能更强大 |
需要自定义Python版本 |
|
conda |
Anaconda专属,自带包管理 |
数据科学、多语言混合项目 |
|
pipenv |
依赖锁定 + 虚拟环境二合一 |
复杂依赖管理 |
|
poetry |
现代依赖管理,支持打包发布 |
开源项目、团队协作 |
新手建议:从venv或virtualenv入门,再逐步探索其他工具。
2. 创建你的虚拟环境
2.1. venv 详解
2.1.1. 环境准备
为了使用venv虚拟环境,请下载 python3.3 以上版本,你可以在命令行中查看当前版本
python --version

如果版本满足条件,你接着需要检查venv是否可用
python -m venv --help
# 若显示帮助信息说明功能正常

2.1.2. 主要语法
创建环境:
当你想要为项目使用虚拟环境时,首先你需要创建一个虚拟环境
# 基础创建(推荐使用项目根目录)
python -m venv .venv
# 高级选项:
python -m venv .venv \
--prompt "MyProject" \ # 自定义终端提示符
--without-pip \ # 不安装pip(特殊场景使用)
--system-site-packages # 继承全局包(慎用!)
如果你有多个 python 版本,也可以创建不同版本的虚拟环境
# 为不同Python版本创建环境
python3.10 -m venv .venv310
python3.11 -m venv .venv311
启用环境:
之后就是环境激活,不同操作系统的指令略有不同。
Windows系统:
.venv\Scripts\activate
# 激活后提示符变为 (.venv) PS C:\path>
macOS/Linux:
source .venv/bin/activate
# 激活后提示符变为 (.venv) user@host:~$

验证激活状态:
which python # Linux/macOS系统
where python # Windows系统
# 应显示虚拟环境路径下的python
退出环境:
deactivate
删除环境(谨慎操作):
# 直接删除环境目录即可
rm -rf .venv # Linux/macOS
rd /s /q .venv # Windows
安装与管理依赖:
安装依赖就是正常的pip操作,值得一提的是你可以直接导出本项目需要的环境清单,方便他人安装对应的版本。
# 安装指定库
pip install django==4.0
# 导出依赖清单
pip freeze > requirements.txt
# 根据清单安装
pip install -r requirements.txt
2.1.3. 进阶操作
1. 专业开发目录规范:
/project_root
├── .venv/ # 虚拟环境(不要提交到Git)
├── src/ # 源代码
├── tests/ # 单元测试
├── docs/ # 文档
└── requirements/ # 分级依赖管理
├── base.txt # 核心依赖
├── dev.txt # 开发工具(pytest等)
└── prod.txt # 生产环境专用
2. 依赖维护进阶技巧:
# 分层安装依赖
pip install -r requirements/base.txt
# 开发时额外安装
pip install -r requirements/dev.txt
# 导出精确依赖树
pip freeze | grep -v "pkg-resources" > requirements.txt
3. 环境迁移:
# 快速复制环境(需安装pip-tools)
pip-compile requirements.in > requirements.txt
pip-sync requirements.txt
4.IDE 集成,PyCharm 配置:
- 打开
File > Settings > Project: xxx - 点击设置 ⚙️ 图标选择
Add Interpreter(添加解释器) - 勾选
Existing environment(已存在的环境)并指向.venv目录
2.2. Virtualenv 详解
2.2.1. Virtualenv 是什么
Virtualenv 诞生于2007年,比Python自带的venv早了整整6年!它曾拯救无数开发者于"依赖地狱",至今仍在维护Python2项目的战场上发光发热。

2.2.2. 使用方式
我们用 virtualenv 来维护一个Python 2.7 项目进行示范:
# 1. 安装Virtualenv(全局安装)
pip install virtualenv
# 2. 创建Python 2.7环境
virtualenv --python=python2.7 legacy_env
# 3. 激活环境
# Linux/macOS
source legacy_env/bin/activate
# Windows
legacy_env\Scripts\activate
# 4. 验证版本
python --version # 应显示 Python 2.7.x
# 5. 安装旧版依赖
pip install django==1.11
# 6. 导出依赖清单
pip freeze > requirements.txt
# 7. 退出环境
deactivate
有没有发现跟venv很像?
那么我们来对比一下二者:
|
对比维度 |
Virtualenv |
venv |
|
发布时间 |
2007年 |
2014年(Python 3.3引入) |
|
Python版本支持 |
支持 Python 2.x 和 3.x 全系列 |
仅支持 Python 3.3+ |
|
安装方式 |
需额外安装: |
Python 3.3+ 自带,无需安装 |
|
环境创建速度 |
较慢 |
较快 |
|
社区支持 |
活跃(仍在维护) |
官方支持 |
|
典型使用场景 |
Python 2.x 项目、自定义环境需求 |
Python 3.3+ 新项目、标准环境需求 |
2.2.3. 进阶技巧
1. 环境迁移秘籍
# 创建可迁移环境
virtualenv --relocatable myenv
# 打包环境
tar czvf myenv.tar.gz myenv/
# 在新机器解压后直接使用
2. 多版本管理
# 同时管理多个Python版本
virtualenv --python=python3.6 py36_env
virtualenv --python=python3.10 py310_env
3. 结合 virtualenvwrapper
virtualenvwrapper是管理virtualenv的工具,它提供了更方便的方式来创建、切换、删除和管理虚拟环境。
# 安装增强工具
pip install virtualenvwrapper
# 常用命令
mkvirtualenv new_env # 创建环境
workon # 列出所有环境
workon new_env # 切换环境
rmvirtualenv old_env # 删除环境
2.2.4. 什么时候选择 Virtualenv?
建议使用的场景:
✅ 维护 Python 2.x 历史项目
✅ 需要自定义解释器路径
✅ 环境需要迁移到不同机器
✅ 配合 virtualenvwrapper 使用
不建议使用场景:
❌ 纯 Python 3.3+ 新项目(优先选venv)
❌ 需要非Python依赖(建议用conda)
2.3. Pipenv 详解
2.3.1. Pipenv 是什么?
聪明的小伙伴会发现,这个库的名字叫做pip和env,那么这个玩意是不是跟pip有关呢?恭喜你!答对了!Pipenv = pip + virtualenv 的增强版,它就是一个管理虚拟环境和依赖关系的集合体。
Pipenv 是一个 Python virtualenv 管理工具,它支持多种系统,能为你的项目自动创建、管理虚拟环境,同时,当你安装、卸载包时,它能自动在你的 Pipfile 中添加、删除记录。它还会为你生成一个相当重要的 Pipfile.lock 文件,用来产生一致性的构建。

特点:
- 一键式环境管理
- 自动创建/删除虚拟环境
- 智能识别项目路径
- 用易读的
Pipfile替代requirements.txt - 通过
Pipfile.lock精确锁定依赖版本 - 自动检查安全漏洞
- 依赖哈希校验防篡改
2.3.2. 使用方式
1. 安装 Pipenv
# 全局安装
pip install pipenv
# 验证安装
pipenv --version # 输出示例:pipenv, version 2023.10.3
2. 初始化项目环境
# 进入项目目录
cd myproject
# 初始化环境(自动创建虚拟环境)
pipenv install
3. 创建环境后会自动生成文件:
Pipfile(TOML 格式)
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = "*"
django = "==4.2"
[dev-packages]
pytest = "*"
[requires]
python_version = "3.10"
Pipfile.lock(JSON 格式)
- 记录所有依赖的哈希值和版本
4. 管理依赖:
|
操作 |
命令 |
示例 |
|
安装生产依赖 |
|
|
|
安装开发依赖 |
|
|
|
指定版本安装 |
|
|
|
卸载依赖 |
|
|
|
更新所有依赖 |
| |
|
更新单个依赖 |
|
|
5. 环境与依赖控制:
- 进入虚拟环境:
pipenv shell # 激活环境
- 直接运行命令(无需激活环境):
pipenv run python app.py
- 查看依赖树:
pipenv graph
# 输出示例:
# requests==2.31.0
# - certifi [required: >=2017.4.17, installed: 2023.7.22]
# - charset-normalizer [required: >=2,<4, installed: 3.3.2]
- 锁定依赖版本:
pipenv lock # 生成/更新 Pipfile.lock
6. 配置与镜像加速
修改镜像源:
# 永久设置阿里云镜像
pipenv install --pypi-mirror https://mirrors.aliyun.com/pypi/simple/
环境变量管理:
# 在 .env 文件中定义变量
echo "API_KEY=12345" > .env
# Pipenv 会自动加载
2.3.3. 示例:开发一个 Web 项目
# 1. 创建项目
mkdir myweb && cd myweb
# 2. 初始化环境并安装依赖
pipenv install django==4.2
pipenv install --dev pytest
# 3. 激活环境
pipenv shell
# 4. 创建Django项目
django-admin startproject core .
# 5. 运行开发服务器
python manage.py runserver
# 6. 退出环境
exit
# 7. 导出 requirements.txt
pipenv lock -r > requirements.txt
2.3.4. 进阶技巧
1. 多阶段依赖安装
# 仅安装生产依赖(用于部署)
pipenv install --deploy --ignore-pipfile
2. 环境清理
pipenv clean # 删除未在 Pipfile 中声明的包
3. 脚本自动化
# Pipfile 中添加
[scripts]
start = "python manage.py runserver"
test = "pytest tests/"
pipenv run start # 运行自定义脚本
4. 环境可视化
# 查看依赖树
pipenv graph
# 检查漏洞
pipenv check
2.3.5. 什么时候选择 Pipenv?
建议使用的场景:
✅ Web 应用开发
✅ 需要严格版本锁定的项目
✅ 团队协作场景
不建议使用场景:
❌ 超小型脚本(杀鸡用牛刀)
❌ 需要兼容 Python 2.x 的旧项目

4万+

被折叠的 条评论
为什么被折叠?



