1. 虚拟环境是什么
这是什么:虚拟环境(venv) = 一个独立、私有的 Python 副本,有自己的解释器入口和自己的包目录,每个项目各有一个世界。
为什么用:全局装包只有一个版本坑位:A 项目要 Flask 2.x,B 项目要 Flask 3.x,装谁都会弄崩另一个,这叫依赖地狱。
如何用:本章先看没有它时的惨案,再看清隔离是怎么解决的,你就明白为什么每个项目都要开一个环境。
1.1 先看没有它的惨案
假设你只有一套全局 Python,第三个项目接踵而来:
# 项目 A:Flask 2.x 写的老代码
# 项目 B:某库要求 Flask 3.x
pip install flask # 装一个,另一个崩
这就是 依赖地狱(dependency hell):不同项目需要同一批库的不同版本,而全局装包只有一个版本坑位。更糟的是——卸载 A 项目的依赖时,可能顺手拆掉 B 需要的东西。
1.2 虚拟环境怎么解决
每个项目开一个「平行世界」,世界里的 pip 只影响本世界:
项目A/.venv → Flask 2.0
项目B/.venv → Flask 3.1
(互不可见、互不影响)
你还可以随意删掉一个世界重建(删文件夹即可),全局 Python 分毫未损。
| 对比项 | 全局装包 | 虚拟环境 |
|---|---|---|
| 版本冲突 | 一套版本,互相打架 | 每项目一套,随你摆 |
| 卸载 | 牵一发动全身 | 删目录 = 一干二净 |
| 部署复现 | 不知道装过什么 | 快照式依赖清单 |
| 团队协作 | 「我这里能跑」玄学 | 清单 + 环境,人人一致 |
1.3 三条真理
- Python 自带
venv模块——不用装任何东西(Python 3.3+) - 虚拟环境只是个文件夹(惯例名
.venv),里面装着一个专属的 Python - 「激活」只是让当前终端指向这个文件夹里的解释器,不是格式化系统
社区通用惯例:一个项目目录 + 一个
.venv目录。.gitignore里把.venv/排除(第 4 章验证)。
1.4 动手改
- 确认 Python 版本:
python --version(3.3+ 都有 venv) - 在任一目录
python -m site,看看「全局」的包都躺在哪里(对照下一章的结果)
1.5 小结
- 全局装包 → 依赖地狱;虚拟环境 → 每项目一个隔离世界
- venv 内置无依赖,环境就是一个文件夹
- 激活 = 当前终端使用环境内的解释器
下一章:创建与激活第一个虚拟环境 🐸