Import

python的导入系统

一个模块中的Python代码通过导入的过程获得对另一个模块中的代码的访问。import语句是调用导入机制的最常用方法,但它不是唯一的方法。诸如importlib.import_module()和内置__import__()之类的函数也可以用于调用导入机制。 import语句组合两个操作;它搜索指定的模块,然后将该搜索的结果绑定到本地作用域中的名称。import语句的搜索操作被定义为使用适当的参数调用__import__()函数。__import__()的返回值用于执行import语句的名称绑定操作。有关该名称绑定操作的确切详细信息,请参见import语句。 直接调用__import__()只执行模块搜索,如果找到,则执行模块创建操作。虽然可能会发生某些副作用,例如导入父包以及更新各种缓存(包括sys.modules),但只有import语句会执行名称绑定操作。 当调用__import__()作为import语句的一部分时,将调用标准的内置__import__()。用于调用导入系统的其他机制(例如importlib.import_module())可以选择颠覆__import__()并使用其自己的解决方案来实现导入语义。 首次导入模块时,Python会搜索模块,如果找到,它会创建一个模块对象[1],并初始化它。如果找不到指定的模块,则会引发ImportError。当执行导入机制时,Python实现各种策略来搜索命名的模块。这些策略可以通过使用下面部分中描述的各种钩子来修改和扩展。 在版本3.3中更改:导入系统更新成完全实现 PEP 302的第二阶段。不再有任何隐式导入机制 - 完整导入系统通过sys.meta_path暴露。此外,已实现原生命名空间包支持(参见 PEP 420)。 1. importlib importlib模块提供了一个丰富的API,用于与导入系统进行交互。例如importlib.import_module()提供了一个比内置的__import__()更简单的API来调用导入机制。有关其他详细信息,请参阅importlib库文档。 2. 包Packages Python只有一种模块对象,所有的模块都是这种类型,不管这个模块是否是用Python,C,或者其他语言实现。为了帮助组织模块并提供命名层次结构,Python有一个概念:包。 你可以认为包是文件系统中的一个目录并且模块作为文件存放于目录中,但是不要做这种太字面化的类比因为包和模块不需要源于文件系统。从这篇文档的目的是我们用目录和文件这个方便的类比来解释包和模块。和文件系统一样,包有有层次的组织着,并且包本身也会包含子包,规则的模块也一样。 重要的是请注意所有的包都是模块,但不是所有的模块都是包。换句话说,包只是一种特殊形式的模块。具体来说,包含__path__属性的任何模块都被视为包。 所有的模块都有名字。子模块的名字是通过点号从父模块中分离出来的,和Python标准的属性访问语法相似。因此,您可能有一个名为sys的模块和一个名为email的软件包,其中包含一个名为email.mime的子包,名为email.mime.text的子包。 2.1 普通包 Python defines two types of packages, regular packages and namespace packages. Regular packages are traditional packages as they existed in Python 3.2 and earlier. A regular package is typically implemented as a directory containing an init.py file. When a regular package is imported, this init.py file is executed, and the objects it defines are bound to names in the package’s namespace.