5. 导入系统
一个 module 内的 Python 代码通过 importing 操作就能够访问另一个模块内的代码。 import
语句是发起调用导入机制的最常用方式,但不是唯一的方式。 importlib.import_module()
以及内置的 __import__()
等函数也可以被用来发起调用导入机制。
import
语句结合了两个操作;它先搜索指定名称的模块,然后将搜索结果绑定到当前作用域中的名称。 import
语句的搜索操作定义为对 __import__()
函数的调用并带有适当的参数。 __import__()
的返回值会被用于执行 import
语句的名称绑定操作。 请参阅 import
语句了解名称绑定操作的更多细节。
对 __import__()
的直接调用将仅执行模块搜索以及在找到时的模块创建操作。 不过也可能产生某些副作用,例如导入父包和更新各种缓存 (包括 sys.modules
),只有 import
语句会执行名称绑定操作。
当 import
语句被执行时,标准的内置 __import__()
函数会被调用。 其他发起调用导入系统的机制 (例如 importlib.import_module()
) 可能会选择绕过 __import__()
并使用它们自己的解决方案来实现导入机制。
当一个模块首次被导入时,Python 会搜索该模块,如果找到就创建一个 module 对象 1 并初始化它。 如果指定名称的模块未找到,则会引发 ModuleNotFoundError
。 当发起调用导入机制时,Python 会实现多种策略来搜索指定名称的模块。 这些策略可以通过使用使用下文所描述的多种钩子来加以修改和扩展。
在 3.3 版更改: 导入系统已被更新以完全实现 PEP 302 中的第二阶段要求。 不会再有任何隐式的导入机制 —— 整个导入系统都通过 sys.meta_path
暴露出来。 此外,对原生命名空间包的支持也已被实现 (参见 PEP 420)。