AI 项目的依赖动辄几百 MB、还常为 numpy 版本打架——venv 给每个项目一个隔离的【独立房间】:建、进、出三条命令走天下,管理就是 pip freeze 备清单。
6-5 首次讲 venv 时,它是 PEP 668 逼出来的【正路第二条】;本节把它展开成 AI 实验的地基——后面四节的所有安装与运行都在虚拟环境里。【装带前缀、import 去掉前缀】【venv 必加 --system-site-packages】这两条 6-5/10-4 的老规矩在本节合流,并用 AI 项目的真实依赖冲突说明【为什么非隔离不可】。
一、为什么 AI 项目非隔离不可
AI 生态的依赖有两个特点,决定了【系统 Python 直接装】迟早出事:
- 体积巨大:OpenCV 几十 MB,PyTorch(YOLO 的发动机)要上 GB——全塞进系统 Python,很快变垃圾场
- 版本敏感:项目 A 要 numpy 1.x、项目 B 要 numpy 2.x,系统里只有一份 numpy——装了 B 就坏 A,还报出一堆看不懂的底层错误
venv(virtual environment,虚拟环境)=给每个项目复制一套【独立的 Python + 独立的包目录】:环境 A 装 1.x、环境 B 装 2.x,互不见面。这不是可选项,是 AI 实验的标准姿势。
二、三条命令走天下
cd ~
python3 -m venv aienv # ① 建:生成一个叫 aienv 的环境目录
source aienv/bin/activate # ② 进:激活(提示符前面多出 (aienv))
deactivate # ③ 出:退出(直接敲,不用 source)
看提示符确认自己在哪:命令行开头出现 (aienv) 才说明在里面——这时 python3 与 pip3 都指向环境内的副本;退出后恢复系统版本。
两条老规矩在本节合流:
- PEP 668 依然管着系统 Python(6-5):不激活环境就
pip install大包,仍会被externally-managed-environment拒绝——venv 里不受限 - 要用 apt 装的库(opencv、picamera2、gpiozero)时,建环境必须加参数:
python3 -m venv aienv --system-site-packages # 环境能【看见】系统 apt 装的包
不加这个参数,环境里 import cv2 直接 ModuleNotFoundError——10-4 踩过的坑,AI 章节是高发区(OpenCV 几乎必用 apt 版,见 11-2)。
三、日常管理四件事
pip list # 环境里装了什么
pip freeze > requirements.txt # 把清单导出成文件(精确版本号)
pip install -r requirements.txt # 在别处按清单一键复刻
rm -rf ~/aienv # 删除环境=直接删目录(环境只是个文件夹,没有卸载仪式)
requirements.txt 是 AI 项目的【实验记录本】:几个月后回看项目、或把代码发给别人,一张清单胜过十段回忆。注意顺序:先激活环境再 freeze,否则导出的是系统 Python 的清单。
venv 不适合搬家:环境目录里写死了绝对路径,拷到别的机器或别的目录多半起不来——正确做法是导出 requirements.txt,到新地方重建环境再装。
四、老教程里的熟脸:认得出即可
- virtualenv:venv 的前身,功能重叠,现代 Python 直接用内置 venv
- conda / miniconda:另一套环境管理器(AI 圈流行),安装方式和命令都不同——见到 conda 教程先认清它不是 venv
- pipx:管【命令行工具】的环境,不是管项目库的——不是本章主题
五、动手 Demo:建一个 AI 实验专用环境并验明正身
# ① 建(带 system-site-packages:要吃 apt 装的 opencv/picamera2)
cd ~
python3 -m venv aienv --system-site-packages
# ② 进
source aienv/bin/activate
# 此刻提示符应变成 (aienv) ...$
# ③ 验明正身
which python3 # 应指向 ~/aienv/bin/python3
pip list # 只有寥寥几个包 + 系统 apt 装的库
python3 -c "import cv2; print(cv2.__version__)" # 若 11-2 还没装 OpenCV,这行会报错——正常
# ④ 出
deactivate
which python3 # 恢复指向 /usr/bin/python3
看到什么算成功:激活后 which python3 指向 ~/aienv/bin/python3,提示符带 (aienv);退出后两者都恢复。
读结果:pip list 里【自带包极少、系统 apt 包隔墙可见】——这就是【隔离 + system-site-packages】的实物演示。以后每次开新终端做 AI 实验,第一件事都是 source ~/aienv/bin/activate(6-5 说过的:激活不跨终端)。
六、30 秒实验:亲眼看一次【隔离】
# 系统里的 pip 包数量
pip list 2>/dev/null | wc -l
# 新建一个【不加】system-site-packages 的环境,进去数
python3 -m venv /tmp/bare && source /tmp/bare/bin/activate
pip list | wc -l
deactivate && rm -rf /tmp/bare
- 两个数字差多少?
- 差的那部分是什么?
参考答案:1. 系统 Python 通常几十上百行(apt 装的 gpiozero、picamera2……都在),裸环境一般只有 3 行左右(pip、setuptools、再加一两个),差距就是【系统 apt 装的那批库】。2. 这正是隔离的含义:裸环境看不见 apt 的库——所以要用 opencv/picamera2 的环境必须 --system-site-packages 建,实验里两次数字的差就是这条参数的价值。
七、常见误区
- 【venv 建一次,以后所有终端自动生效】 —— 激活只对当前终端有效;新开终端要重新
source activate(6-5 的老规矩,最高频翻车点)。 - 【在环境里装了 opencv 就能用】 —— 反了:OpenCV 推荐 apt 装(11-2),环境靠
--system-site-packages借用;环境内 pip 装 opencv 版本容易和 numpy 打架。 - 【删环境要卸载什么】 —— 没有卸载仪式,
rm -rf目录即完成删除;删之前确认提示符不在环境里(在也只是路径失效,无实害)。 - 【requirements.txt 拷过去就能跑】 —— 它只管 Python 包,不管系统级依赖(apt 装的 OpenCV、libcamera);复刻环境=apt 那部分 + pip 清单两条腿。
- 【把 venv 目录拷给别人】 —— 环境内路径写死,拷过去多半起不来;给
requirements.txt让对方重建。
自测三问(点开对答案)
1. AI 项目为什么不能把包装进系统 Python? 2. `--system-site-packages` 解决什么问题? 3. 把项目发给别人,正确的【搬家】方式是什么? **参考答案** 1. 体积大(PyTorch 上 GB)+版本敏感(不同项目要不同 numpy),系统只有一份 numpy,早晚打架;venv 给每个项目独立房间。 2. 让环境**看得见 apt 装的系统库**(OpenCV/picamera2/gpiozero);不加这个参数,环境内 `import cv2` 报 ModuleNotFoundError。 3. `pip freeze > requirements.txt` 导出清单,对方重建 venv(加 `--system-site-packages`)后 `pip install -r requirements.txt`;环境目录本身不要拷。- ☐ 下一节(11-2 在树莓派安装 OpenCV)
相关笔记
- Python 函数与模块 —— PEP 668 与 venv 的首次登场
- 使用 Python 操作相机模块 —— system-site-packages 的第一次实战
- 在树莓派安装 OpenCV —— 下一节:在环境之外把 OpenCV 装好
- 🍓 树莓派 · 索引 —— 全课路线图