Python中模块是.py文件,包是含__init__.py的目录,库是第三方分发的模块/包集合;三者import语法相同但本质不同:模块为单文件,包组织多个模块,库属生态概念。

因为这三个概念在日常使用中边界模糊,且 Python 自身对它们的定义并不严格——import 语句能导入的,既可以是单个 .py 文件(模块),也可以是带 __init__.py 的文件夹(包),还能是 pip 安装的一整套东西(库)。初学者看到 import requests、import numpy、import myutils,表面上语法完全一样,根本分不清背后加载的是文件、目录还是第三方生态集合。
模块就是 .py 文件,名字不含 .py
模块的本质就是一个可被 import 的 .py 文件。比如你写了 helpers.py,那它的模块名就是 helpers,不是 helpers.py。
- 直接运行时:
__name__ == "__main__";被导入时:__name__ == "helpers" -
import helpers后必须用helpers.func_name()调用 -
from helpers import func_name则可以直接调用func_name(),但容易和已有变量冲突 - 模块里写测试代码时,务必用
if __name__ == "__main__":包裹,否则一导入就执行
包是带 __init__.py 的文件夹,不是“高级模块”
包不是模块的升级版,而是组织多个模块的目录结构。Python 3.3+ 允许无 __init__.py 的“命名空间包”,但绝大多数项目仍依赖传统包——即必须有该文件(哪怕为空)。
-
myproject/目录下有__init__.py和db.py、api.py,它才是包;没__init__.py就只是普通文件夹,import myproject会报ModuleNotFoundError -
__init__.py可以控制包的“接口面”:比如在里面写from .db import connect,外部就能from myproject import connect,而不暴露.db细节 - 包层级深了(如
myproject.utils.helpers),路径错误或缺少中间层的__init__.py会导致导入失败,报错信息常是ImportError: attempted relative import with no known parent package
库是第三方分发单元,和 import 没有直接对应关系
“库”不是 Python 语言层面的概念,而是生态术语。你 pip install flask 下载的是一整个“库”,但它在代码里表现为一个包(flask/ 目录),而这个包内部又包含几十个模块(flask/app.py、flask/blueprints.py 等)。
立即学习“Python免费学习笔记(深入)”;
-
import flask实际导入的是flask/__init__.py所定义的包入口,不是某个单一模块 - 标准库(如
os、json)也是“库”,但它们以模块或包形式内置,无需 pip 安装 - 有人把单个
.py文件也叫“小库”,这不算错,但容易混淆——关键看它是否以独立分发为目的(比如上传到 PyPI)
真正容易踩坑的地方,是以为“能 import 就说明结构正确”。实际上,import 成功只代表 Python 找到了对象,不代表目录结构符合包规范,也不代表你用的方式适合协作或发布。比如删掉 __init__.py 后用相对导入会崩,或者把模块直接扔进 site-packages 而不构建成包,后续升级或卸载就会出问题。


















