模块是单个.py文件,包是含__init__.py的目录;模块提供独立命名空间,包支持层级导入与接口控制,二者协同组织python代码。

Python 中的“模块”和“包”是组织代码的两个基础单位,本质不同但紧密配合:模块是单个 .py 文件,包是包含特殊标记(__init__.py)的目录,用于管理多个模块及其他子包。
模块:一个文件,一个命名空间
模块就是你写的任意一个以 .py 结尾的文件,比如 math_utils.py 或 config.py。导入后,整个文件的内容就成为一个独立的命名空间。
- 直接通过
import math_utils或from config import DEBUG使用 - 不依赖目录结构,只要在 Python 路径(
sys.path)中就能被找到 - 没有内置的“子模块”概念——它本身不可再被“点”出下级结构(除非手动在内部定义类或嵌套模块)
包:带层级的模块集合
包是一个**有组织的目录**,必须包含 __init__.py 文件(可以为空,但必须存在),用来告诉 Python “这个目录应被当作包来处理”。包支持嵌套,从而形成层级导入路径。
- 例如目录
myproject/analysis/__init__.py和myproject/analysis/stats.py,可写from myproject.analysis import stats -
__init__.py可控制包的公共接口:在里面用from .stats import summary再__all__ = ["summary"],调用者from myproject.analysis import *就只拿到指定内容 - 包名不能是纯数字或含短横线(如
2024-tools不合法),需符合变量命名规则
典型项目目录结构示例
一个合理组织的 Python 项目常如下:
立即学习“Python免费学习笔记(深入)”;
myapp/
├── __init__.py # 标记 myapp 是包(若作为库发布)
├── main.py # 入口脚本(通常不属包内,不被导入)
├── utils/
│ ├── __init__.py
│ ├── files.py
│ └── text.py
├── models/
│ ├── __init__.py
│ ├── user.py
│ └── post.py
└── tests/
├── __init__.py
└── test_user.py
-
main.py一般不放进包里,避免循环导入;它负责调用包内功能 - 每个子目录(
utils、models)都是子包,靠__init__.py激活 -
tests/通常不参与安装,但为保持结构清晰也设为包(尤其用 pytest 发现测试时)
导入行为与常见误区
包和模块的导入看似相似,实际机制不同:
-
import utils.files会依次执行utils/__init__.py→utils/files.py;而import utils只执行utils/__init__.py(不会自动导入其下所有模块) - 相对导入(
from . import files或from ..models import user)只在包内部有效,不能在顶层脚本(如main.py)中直接使用 - 忘记
__init__.py是最常见错误——目录存在但无法被 import,报ModuleNotFoundError










