跳转至

2023-09 包管理器补充

内容梗概

本课是第 10 章"第三方库"部分的课堂补充,把 pip、conda、Ubuntu 的 apt、Windows 的 winget 等统一归结为"包管理器"这一大概念,讲解它们的通用架构(索引服务器 + 文件服务器)和 install 命令背后的完整流程。老师按流程逐步分析每一步可能遇到的报错及对策:包名与模块名不一致(yaml/pyyaml、Pillow/PIL)、连接文件服务器 timeout(换源或开代理)、缓存机制等;并顺带解释了"软件装在 D 盘但 C 盘不断变大"的原因(%temp% 与 %appdata% 缓存目录),最后提到手动下载 whl 文件离线安装,以及对旧课件的勘误(pipenv 部分已被 conda 方案取代)。

知识点详解

包管理器是个通用概念(约 00:00–01:29)

  • 不只是 pip:conda、Ubuntu 的 apt(apt install xxx)、各种 Linux 发行版的包管理器、Windows 的 winget,本质上都是**包管理器**。
  • 大家构造基本一样,学会一个就能举一反三。

包管理器的架构:两类服务器(约 01:29–02:25)

  • 逻辑上包含两个服务器(不一定是两台物理机器,可以在同一台机器上):
  • 索引服务器:像书的目录,存一堆文字信息——体积小、要求**响应速度快**;
  • 文件服务器:真正托管包的文件(exe 或源代码)——要求**存储空间大**。
  • 因为两者性能诉求不同,一般会分开部署。

install 背后的完整流程与逐步报错分析(约 02:25–06:11)

平时平平无奇的一句 pip install / conda install,实际经历了多步,每步都可能报错:

  1. 创建临时文件夹(Windows 下很少出错);
  2. 连接索引服务器、获取包的信息——常见报错原因:包名写错。
  3. 重点:包在 pip/conda 里的名字和 import 时的模块名不一定一致!
  4. 例 1:运行时报 No module named 'yaml'(YAML 是现在非常流行的配置文件格式),兴冲冲去 pip install yaml 反而报错——正确的包名是 pyyaml;
  5. 例 2:图像处理名库 Pillow,使用时写 from PIL import Image,但安装时要 pip install Pillow;装错名字会提示服务器上找不到这个包。
  6. 对策:装不上、提示找不到时,先去搜一下该库安装名与导入名是否一致。
  7. 索引服务器返回包/版本信息,查本地缓存——会先到本地 AppData 下的 pip cache 查是否下载过,下载过就直接用缓存安装,没下载过才去文件服务器下载;
  8. 连接文件服务器下载——这一步的典型报错是 timeout(连接超时):文件服务器(如 files.pythonhosted.org)在国外,说明网络不通,要么换源、要么开代理;
  9. 下载到本地后开始安装,循环处理所有依赖直到完成。

副作用:为什么 C 盘不断变大(约 06:11–09:29)

  • 很多人困惑"软件都装在 D 盘,C 盘却不断增大",秘密就在包管理器这类机制里:很多软件会在临时/缓存目录写文件。
  • 两个常见的缓存位置(在文件资源管理器地址栏输入回车即可直达):
  • %temp%:在 C 盘,老师机器上有 1660 个项目、500–600 MB(有的同学可能 2 GB);
  • %appdata%:软件常用缓存目录,比如 Minecraft 在这里缓存了 16 GB;pip 的缓存 pip cache 也在这一带。
  • 了解这些目录有助于清理磁盘和理解安装行为。

离线安装:手动下载 whl(约 10:02–10:41)

  • 从上面的流程可知,pip 下载的本质是一个 .whl(wheel)文件。
  • 完全可以**手动把 whl 文件下载下来,再 pip install 该whl文件**,这样在没有网络的情况下也能成功安装(详细操作正课视频里有,本课不展开)。

课件勘误与工具更新(约 10:41–结尾)

  • 原课件"虚拟环境的管理"一节讲的是 pipenv(标题还写错了),老师明确说自己现在也不用了,建议改用 conda create 创建虚拟环境。
  • 课件中 conda 与 Anaconda 关系的示意图不准确:Miniconda ≈ conda + 一个干净的 Python(没有那堆预装包管理的地方),图待修改——"要与时俱进"。

示例与演示

  • 报错情景复现:No module named 'yaml' → 误装 pip install yaml 失败 → 正解 pip install pyyaml;Pillow 库安装名与 from PIL import ... 导入名的反差。
  • 资源管理器演示:地址栏输入 %temp% 查看临时文件夹(1660 个项目),输入 %appdata% 查看各软件缓存(Minecraft 占 16 GB),并找 pip cache 目录。
  • 换源方式的提示:除了命令行改 pip 源之外,还有配置文件方式,具体见正课视频,课上不细讲。

重点与难点

  • 安装包名 ≠ 导入模块名:yaml/pyyaml、Pillow/PIL 是经典例子,装包报"找不到"时第一反应应该是去查正确包名,而不是怀疑自己。
  • 按流程定位报错:获取包信息阶段报错 → 多半是包名问题;下载阶段 timeout → 网络问题,换源(如国内镜像)或开代理。
  • 缓存机制:下载过的包存在本地 pip cache,重复安装会直接用缓存;换源后要清缓存再测试。
  • %temp%、%appdata% 两个目录解释了 C 盘莫名变大的原因,也可作为清理入口。
  • 工具选型更新:pipenv 已弃用,虚拟环境统一用 conda 管理。

关联内容

  • 对应正课第 10 章:10.1 第三方库、10.2 包管理系统(本课是对其的深入补充)、10.3 国内镜像源(换源)、10.4 离线安装与 whl 文件、10.5 虚拟环境管理(pipenv → conda 的更新)。
  • 承接 2023-08 的部署演示:换脸项目运行时报 No module named 'yaml' 正是本课分析的典型案例;timeout 与换源讨论也与 2023-08 的 .condarc 清华源内容呼应。
  • 前置知识:C 语言编译的经历(理解"本地编译报错")、Windows 环境变量与文件系统的基本操作。