当在 Python 中导入模块时,解释器会在 sys.path 列表中的目录中查找该模块。首先会查找标准模块,然后查找 .py、.pyc 文件和包含 __init__.py 文件的目录(包)。
sys.modules 中获取它。ModuleNotFoundError 异常。.pyc) 并缓存(如果有写入权限)。# mypkg/__init__.py (可以是空的) # mypkg/mod.py # main.py import mypkg.mod
__init__.py 的存在与否(对于 Python <3.3 是必需的)—— 这一切都很重要。sys.path 目录中的查找(当前脚本的目录总是优先)。from . import ...,绝对/相对导入)。如果在你的脚本所在的目录中有一个名为
random.py的文件,你尝试导入标准模块random会发生什么?
将导入我自己的本地文件 random.py,而不是标准库。难以发现的错误常常是由于模块名称与库冲突(遮蔽)。文件命名应谨慎。
故事
在一个大型项目中,模块 email.py 偶然遮蔽了标准库中的 email 模块,开发人员花了很长时间才理解为什么无法从第三方库解析邮件。
故事
在 ML 项目中,os.path 函数无法工作:主脚本旁边有一个文件 os.py,它拦截了所有对标准模块的调用。花了一个月的调试时间才找到名称冲突。
故事
在微服务 REST API 中,尝试在多个子包之间进行相对导入模型时出现了循环导入。只有在重构项目结构和明确加载模块的顺序后才解决了问题。