2023-06 模块与包补充¶
内容梗概¶
本课是第 10 章"第三方库与虚拟环境"的课堂补充,围绕"模块与包"的基本概念展开。老师先解释 Python 之所以流行是因为社区生态好——大量第三方开发者贡献了模块和包,并配有完善文档。随后厘清了模块(单个 .py 文件)与包(含 __init__.py 的文件夹)的区别,说明 __init__.py 的作用、pip install 安装的包实际落在 site-packages 目录,最后讲了包内部开发时使用相对路径导入(. 与 ..)的方法。
知识点详解¶
Python 社区生态与第三方库(约 00:00–00:53)¶
- Python 火爆的专业说法是其**社区生态好**:热心开发者多,开发了大量"量大管饱"的模块和包,覆盖各种需求,可以快速构建自己的应用程序。
- 大家还会编写各种文档,方便使用者快速查到某个包怎么用。
模块与包的区别(约 00:54–01:23)¶
- 模块(module)就是文件:一个
xxx.py就是一个模块。 - 包(package)就是文件夹:把多个模块(
a.py、b.py、c.py等)放进同一个文件夹,就是一个包;包还可以有子文件夹(子包)。
__init__.py 的作用(约 01:23–02:50)¶
- 包文件夹及其子文件夹下都会放一个
__init__.py("init" 是 initialization 的前四个字母,注意前后各两个下划线)。 - Python 解释器加载到包文件夹时,会自动在文件夹里搜索
__init__.py,通过其中的内容**初始化包的基本环境或加载基本变量**。 - 举例:一个音频库可能要在
__init__.py中设置默认采样率(如 44100)、默认比特率(如 192 kbps)等参数,并写上包的名字等信息。
包的安装位置:site-packages(约 02:51–03:48)¶
- 常用
pip install xxx(或 miniconda 环境下conda install xxx)安装包,两者本质结果类似:都会把包下载、安装到 Python 安装目录下的site-packages文件夹中,这是 Python 内部的机制。 - 排错思路:运行别人的项目时如果报"找不到包",可以先去
site-packages目录查看该包是否存在;没有说明没装,用pip install安装即可。
包的导入与相对路径导入(约 03:49–05:32)¶
- 包的导入和模块导入一样有多种写法(视频课中已详讲,本课不赘述)。
- 做大型项目时,如果要以**包的开发者**身份在包内部互相调用模块(例如 sound 包的开发者在
waveread.py里调用 effects 子包的功能),不能直接用包名导入,必须用**相对路径导入**: from . import xxx(一个点):导入**当前目录**下的模块;from ..effects import echo(两个点):导入**上一级目录**下其他子包中的模块。
示例与演示¶
- 以课件中的经典 **sound 包**目录结构为例(
sound/含__init__.py、formats/、effects/等子包),讲解包的嵌套结构和__init__.py的分布。 - 以"sound 包开发者想在
waveread.py中使用 effects 里的echo"为情境,演示相对导入写法:用..effects访问上一级目录的子包。 - 预告了后续演示:到虚拟环境中实际查看
site-packages目录,验证包装在哪里(见 2023-07 课程)。
重点与难点¶
- 核心概念一句话:模块就是文件,包就是文件夹,名字玄乎但本质简单。
__init__.py的书写:前后各**两个**下划线,容易写错;它是解释器识别并初始化包的关键文件。- 包的使用者(
import 包名)与包的开发者(包内部用./..相对导入)是两种视角,不要混淆;大型项目内部导入要用相对路径。 - 遇到
ModuleNotFoundError类报错的排查路径:先看site-packages里有没有,没有就pip install。
关联内容¶
- 属于第 10 章"第三方库与虚拟环境"(10.1 第三方库、10.4 离线安装与 whl 文件、10.5 虚拟环境管理、10.6 Python 与 Anaconda)的补充讲解。
- 模块导入的多种写法在正课视频中已讲(对应"模块与包"章节),本课只做补充。
- 为后续 2023-07(Conda 虚拟环境)中实地查看
site-packages埋下伏笔;相对导入的知识与大型项目工程化相关。