Python包与模块区别_目录结构说明

5次阅读

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

Python 包与模块区别_目录结构说明

Python 中的“模块”和“包”是组织代码的两个基础单位,本质不同但紧密配合:模块是单个 .py 文件,包是包含特殊标记(__init__.py)的目录,用于管理多个模块及其他子包。

模块:一个文件,一个命名空间

模块就是你写的任意一个以 .py 结尾的文件,比如 math_utils.pyconfig.py。导入后,整个文件的内容就成为一个独立的命名空间。

  • 直接通过 import math_utilsfrom config import DEBUG 使用
  • 不依赖目录结构,只要在 Python 路径(sys.path)中就能被找到
  • 没有内置的“子模块”概念——它本身不可再被“点”出下级结构(除非手动在内部定义类或嵌套模块)

包:带层级的模块集合

包是一个 ** 有组织的目录 **,必须包含 __init__.py 文件(可以为空,但必须存在),用来告诉 Python“这个目录应被当作包来处理”。包支持嵌套,从而形成层级导入路径。

  • 例如目录 myproject/analysis/__init__.pymyproject/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 一般不放进包里,避免循环导入;它负责调用包内功能
  • 每个子目录(utilsmodels)都是子包,靠 __init__.py 激活
  • tests/ 通常不参与安装,但为保持结构清晰也设为包(尤其用 pytest 发现测试时)

导入行为与常见误区

包和模块的导入看似相似,实际机制不同:

  • import utils.files 会依次执行 utils/__init__.pyutils/files.py;而 import utils 只执行 utils/__init__.py(不会自动导入其下所有模块)
  • 相对导入(from . import filesfrom ..models import user)只在包内部有效,不能在顶层脚本(如 main.py)中直接使用
  • 忘记 __init__.py 是最常见错误——目录存在但无法被 import,报 ModuleNotFoundError

text=ZqhQzanResources