🍓 第十一章 AI 实验范例(一):计算机视觉+AI 识别-OpenCV+YOLO
📄 一句话概括

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 直接装】迟早出事:

  1. 体积巨大:OpenCV 几十 MB,PyTorch(YOLO 的发动机)要上 GB——全塞进系统 Python,很快变垃圾场
  2. 版本敏感:项目 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 都指向环境内的副本;退出后恢复系统版本。

两条老规矩在本节合流:

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,到新地方重建环境再装。

四、老教程里的熟脸:认得出即可

五、动手 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. 两个数字差多少?
  2. 差的那部分是什么?

参考答案:1. 系统 Python 通常几十上百行(apt 装的 gpiozero、picamera2……都在),裸环境一般只有 3 行左右(pip、setuptools、再加一两个),差距就是【系统 apt 装的那批库】。2. 这正是隔离的含义:裸环境看不见 apt 的库——所以要用 opencv/picamera2 的环境必须 --system-site-packages 建,实验里两次数字的差就是这条参数的价值。

七、常见误区

  1. 【venv 建一次,以后所有终端自动生效】 —— 激活只对当前终端有效;新开终端要重新 source activate(6-5 的老规矩,最高频翻车点)。
  2. 【在环境里装了 opencv 就能用】 —— 反了:OpenCV 推荐 apt 装(11-2),环境靠 --system-site-packages 借用;环境内 pip 装 opencv 版本容易和 numpy 打架。
  3. 【删环境要卸载什么】 —— 没有卸载仪式,rm -rf 目录即完成删除;删之前确认提示符不在环境里(在也只是路径失效,无实害)。
  4. 【requirements.txt 拷过去就能跑】 —— 它只管 Python 包,不管系统级依赖(apt 装的 OpenCV、libcamera);复刻环境=apt 那部分 + pip 清单两条腿。
  5. 【把 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`;环境目录本身不要拷。

相关笔记