跳转至

10.5 第三方库与虚拟环境——虚拟环境管理

内容梗概

本节开头先纠正一个"每年都有人犯"的经典错误:在 Python 交互模式(>>>)里执行 pip install。随后系统讲解虚拟环境要解决的三个问题:多版本 Python 共存、不同项目的第三方包隔离、项目依赖的打包交付。老师先介绍了朴素的 pip freeze + requirements.txt 方案及其局限,再以个人偏好的 pipenv 为例完整演示了虚拟环境工作流:安装 pipenv、创建/激活虚拟环境、在隔离环境中装包、理解 Pipfile 与 Pipfile.lock 两个文件的作用(含哈希校验的安全意义)、以及如何通过这两个文件让别人一键复现环境。

知识点详解

1. 常见错误:不要在交互模式里 pip install(约 00:05–01:53)

  • 永远不要在 Python 交互模式(命令行里运行 python 后出现的 >>> 状态)里执行 pip install。
  • 交互模式里写的应该是 Python 语句(代码),不是命令;pip install 应该在**退出到外层命令行**后执行。
  • 这是老师每次讲完 pip 都必有人犯的错误,务必注意。

2. 虚拟环境解决的三个问题(约 02:49–06:56)

  1. 多版本 Python 共存:一台机器装了多个版本的 Python 又想方便地同时使用。
  2. 项目间包隔离:所有第三方包默认都装在安装目录的 site-packages 里,越装越臃肿、搜索费劲;项目 A 用 dlib/OpenCV/numpy,项目 B 用 requests/beautifulsoup,希望**同一版本 Python 下不同项目用不同的包**、互相隔离——这是模块化的程序员思维。
  3. 依赖交付:把代码给别人时,对方总要问"要装哪些包?用什么版本?"——能否随源代码附带一个**依赖配置文件**,让对方快速装好全部依赖?

3. 朴素方案:requirements.txt 及其局限(约 06:56–07:58)

  • pip freeze > requirements.txt:> 是**重定向**,把当前环境安装的第三方包列表写进文件(一般命名为 requirements.txt)。
  • 对方拿到后用 pip install -r requirements.txt 即可快速安装这些包(-r 参数)。
  • 局限:只能解决问题 3,解决不了问题 1(多版本)和问题 2(隔离)——所以才需要虚拟环境。

4. 朴素的多版本切换与自动化工具(约 08:18–11:54)

  • 手动方案:调整/删除**环境变量的顺序**(符合人类直觉但低效,"计算机专业最讨厌低效率")。
  • where python(CMD 中支持,PowerShell 中不支持):列出环境变量里所有 Python 路径,默认用的是排在最上面的那个。
  • 自动化管理工具很多(课上列举了几种但未逐一展开):都能解决多版本管理 + 虚拟环境隔离;Anaconda 自带环境管理、Python 也自带虚拟环境管理,用哪个无所谓——它们的逻辑和机制完全一致。
  • 老师个人偏好 pipenv:它是 requests 库作者开发的虚拟环境管理工具(选用理由主要是常用 requests,顺带调侃作者帅、头发茂密)。

5. pipenv 的安装与版本指定(约 11:54–14:49)

  • pipenv 本身是一个第三方库,要先 pip install pipenv 才能用它来管理虚拟环境。
  • 老师配置新电脑的习惯:装好 Python 后第一件事就是 pip install pipenv。
  • 直接运行 pipenv 可查看参数列表;--python 参数可指定用哪个版本/哪个路径的 Python 创建环境,如 pipenv --python 3.7,它会搜索环境变量中已装的版本供选择。

6. pipenv 工作流演示(约 14:49–23:14)

  1. 在 VS Code 里新建并打开 demo 文件夹,新建 demo.py(示例代码:import requests、from bs4 import BeautifulSoup)。
  2. pipenv install:创建虚拟环境,自动生成 Pipfile 和 Pipfile.lock 两个文件,提示用 Python 3.7 创建。
  3. 虚拟环境实际位置:用户目录下(Windows:C:\Users\用户名\.virtualenvs\,Mac/Linux 同样在 ~ 用户目录下),目录名为"项目文件夹名 + 随机字符串"。其中也有 Lib/site-packages 和 Scripts(含 pip、python.exe),结构与真正的 Python 安装目录相似。
  4. 此时 where python 仍显示原来的 Python——因为**环境虽创建但尚未激活**。
  5. pipenv shell:激活虚拟环境;激活后命令行提示符前出现括号标识,再 where python 会多出虚拟环境里的 Python。
  6. 在虚拟环境中装包要用 pipenv install 包名(如 pipenv install requests,演示中只装了 requests 而没装 bs4):它会把 requests 及其全部依赖装进**该项目虚拟环境自己的 site-packages** 中——实现**隔离**;用户目录的 .virtualenvs 下多个虚拟环境各自独立。

7. Pipfile 详解(约 23:14–26:35)

  • [[source]]:第三方库来源,默认是官方源——可以改成阿里云镜像源(呼应 10.3;这也解释了演示中装 requests 很慢的原因)。
  • [dev-packages]:开发环境依赖的库(未指定则为空)。
  • [packages]:运行(生产/交付)环境依赖的库。pipenv install requests 后这里出现 requests = "*",* 是**通配符**,表示任何版本都可以;若安装时指定了版本,这里会显示具体版本号。
  • [requires]:当前虚拟环境使用的 Python 版本。
  • Pipfile 可随代码一起交给用户或上传代码仓库,对方拉取后 pipenv install 即可恢复环境。

8. Pipfile.lock 详解(约 26:35–32:46)

  • 内容是 Pipfile 的补充,包含 meta(Python 版本、来源——由 Pipfile 自动生成)、每个包的**精确版本号**和**哈希值**(含 requests 依赖的所有其他包)。
  • 作用一:记录开发者实际使用的精确版本(Pipfile 里虽写"任何版本都行",用户可从这里看到开发时的真实版本)。
  • 作用二:安全性——从服务器(如 PyPI)拉取的包若因服务器被黑客攻击而遭篡改,哈希值必然改变,对比哈希即可发现文件被篡改。老师强调这与专业(信息安全)息息相关:Ubuntu 的 apt 源被攻击是业界屡见不鲜的事,不能嫌麻烦。
  • 代价:lock 阶段很慢(演示中读进度条卡很久)。可用 **--skip-lock 参数**跳过 lock(对赶作业有用的技巧,但老师声明这是不好的习惯)。

9. 环境复现演示(含翻车与教训)(约 32:59–38:26)

  • exit 退出虚拟环境(提示符前的括号消失)。
  • 删除整个虚拟环境文件夹模拟"第三方用户首次拿到项目"(顺带解释:删几千个小文件慢是因为要修改文件记录表——上学期内容)。
  • 只保留 demo.py + Pipfile + Pipfile.lock,执行 pipenv install 即可自动解析 Pipfile 重建环境。
  • 翻车:老师之前手动改过 Pipfile 的 source 但没重新生成 lock,导致两者 source 不一致而报错。教训:不要手动改这两个文件;若改了 Pipfile,应删掉 Pipfile.lock 让它重新生成。
  • 完整复现流程:pipenv install → pipenv shell → python demo.py(因演示偷懒没装 bs4,运行时报找不到 bs4,但 requests 已装好,全装完即可正常运行)。

10. 其他说明

  • 默认环境路径:用户目录下(.virtualenvs);Linux/Mac 在 ~ 下,cd ~ 可见;用了环境变量机制,Windows 相对还方便一点。
  • 开课闲聊:Mac 上预编译 whl 的网址老师回头在群里发;Mac/Linux 编译通常全自动更方便(程序员推崇 Mac 的原因是其编译环境和 Shell 好用),但课程学时有限无法覆盖多系统。

示例与演示

  • 交互模式 vs 命令行的错误示范与纠正。
  • where python 查看多个 Python 版本及优先级顺序。
  • 完整 pipenv 工作流:建 demo 项目 → pipenv install 建环境 → pipenv shell 激活 → pipenv install requests 装包 → 查看虚拟环境目录结构与 site-packages 验证隔离。
  • 解读 Pipfile / Pipfile.lock 内容;--skip-lock 加速。
  • 删除虚拟环境后仅凭 Pipfile/Pipfile.lock + 源码一键复现(含 source 不一致报错的排错过程)。

重点与难点

  • 不要在 >>> 交互模式里执行 pip 命令——最高频错误。
  • 虚拟环境三大作用:多版本管理、项目隔离、依赖交付;pip freeze/requirements.txt 只能解决最后一个。
  • 各种虚拟环境工具(pipenv、Anaconda、Python 自带 venv 等)逻辑机制一致,学会一个即可迁移。
  • 区分命令:pip install(装到全局)vs pipenv install 包名(装到当前项目虚拟环境);pipenv install(无包名时)则按 Pipfile 恢复整个环境。
  • Pipfile.lock 的哈希校验是**供应链安全**的重要手段,不要因嫌慢而轻视(--skip-lock 只是权宜之计)。
  • 不要手动修改 Pipfile/Pipfile.lock,改了 Pipfile 要删 lock 重新生成。

关联内容

  • 呼应 10.3:Pipfile 的 [[source]] 可改国内镜像源;默认官方源导致装包慢。
  • 呼应 10.2/10.4:pipenv install 同样走索引/文件服务器、装到(虚拟环境自己的)site-packages。
  • 项目 A(dlib/OpenCV/numpy)与项目 B(requests/beautifulsoup)的例子呼应第 1 章课程概述的爬虫与换脸演示。
  • "删小文件慢要改文件记录表"关联上学期《计算机安全与维护》课程内容。
  • 下一节 10.6 讲 Python 与 Anaconda 的关系(Anaconda 也提供环境管理工具)。