核心要点
知道 .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 层级导入。
导入:
import mymod
from mypkg import utils
from mypkg.utils import helper as h入口守卫:
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 运行。
追问
追问 1:import 时模块代码会执行几次?
每个解释器进程内,模块首次 import 时顶层代码执行一次,结果缓存在 sys.modules;后续 import 直接取缓存。importlib.reload() 可强制重载。
追问 2:__init__.py 里通常写什么?
包初始化、导出公共 API(__all__)、聚合子模块导入。可为空文件仅标记包。避免在 __init__.py 放重量级副作用代码拖慢 import。
追问 3:相对导入和绝对导入如何选择?
包内模块互引用用 from . import sibling 或 from ..parent import x。脚本直接运行时不应依赖相对导入(无包上下文)。库开发推荐绝对导入更清晰。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯