核心要点

  • 知道 .py 文件即模块、包需 init.py(或 namespace package)

  • 掌握 import / from ... import 与 name == "main"

  • 了解模块搜索路径 sys.path

标准回答

模块:任意 .py 文件即模块,文件名(去 .py)为模块名。

包(Package):含 __init__.py 的目录(Python 3.3+ namespace package 可无 init)。支持 pkg.submod 层级导入。

导入

python
import mymod
from mypkg import utils
from mypkg.utils import helper as h

入口守卫

python
if __name__ == "__main__":
    main()  # 仅直接 python script.py 时执行

搜索路径:当前目录、PYTHONPATH、site-packages。项目结构常用 src layout + 虚拟环境。

AI 项目models/, data/, train.py 分模块;pip install -e . 可编辑安装本地包。

常见误区

⚠️ 常见踩坑

把脚本和模块名取成与标准库同名(如 random.py、json.py),import 时会优先导入自己的文件造成诡异报错。另一个高频坑:直接 python 运行包内子模块却用了相对导入,会报 'attempted relative import with no known parent package',应改用 python -m pkg.module 运行。

追问

追问 1import 时模块代码会执行几次?

每个解释器进程内,模块首次 import 时顶层代码执行一次,结果缓存在 sys.modules;后续 import 直接取缓存。importlib.reload() 可强制重载。

追问 2__init__.py 里通常写什么?

包初始化、导出公共 API(__all__)、聚合子模块导入。可为空文件仅标记包。避免在 __init__.py 放重量级副作用代码拖慢 import。

追问 3相对导入和绝对导入如何选择?

包内模块互引用用 from . import siblingfrom ..parent import x。脚本直接运行时不应依赖相对导入(无包上下文)。库开发推荐绝对导入更清晰。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。