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)¶
- 多版本 Python 共存:一台机器装了多个版本的 Python 又想方便地同时使用。
- 项目间包隔离:所有第三方包默认都装在安装目录的 site-packages 里,越装越臃肿、搜索费劲;项目 A 用 dlib/OpenCV/numpy,项目 B 用 requests/beautifulsoup,希望**同一版本 Python 下不同项目用不同的包**、互相隔离——这是模块化的程序员思维。
- 依赖交付:把代码给别人时,对方总要问"要装哪些包?用什么版本?"——能否随源代码附带一个**依赖配置文件**,让对方快速装好全部依赖?
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)¶
- 在 VS Code 里新建并打开
demo文件夹,新建demo.py(示例代码:import requests、from bs4 import BeautifulSoup)。 pipenv install:创建虚拟环境,自动生成 Pipfile 和 Pipfile.lock 两个文件,提示用 Python 3.7 创建。- 虚拟环境实际位置:用户目录下(Windows:
C:\Users\用户名\.virtualenvs\,Mac/Linux 同样在~用户目录下),目录名为"项目文件夹名 + 随机字符串"。其中也有Lib/site-packages和Scripts(含 pip、python.exe),结构与真正的 Python 安装目录相似。 - 此时
where python仍显示原来的 Python——因为**环境虽创建但尚未激活**。 pipenv shell:激活虚拟环境;激活后命令行提示符前出现括号标识,再where python会多出虚拟环境里的 Python。- 在虚拟环境中装包要用
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(装到全局)vspipenv 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 也提供环境管理工具)。