31.5. importlib - 执行import

版本3.1中的新功能。

源代码: Lib / importlib / __ init __。py

31.5.1. Introduction

importlib包的目的是双重的。一个是在Python源代码中提供import语句(以及扩展名为__import__()函数)的实现。这提供了可以移植到任何Python解释器的import的实现。这也提供了比在除了Python之外的编程语言中实现的实现更容易理解的实现。

第二个目的是,实现import的组件在此包中公开,使用户更容易创建自己的自定义对象(通常称为importer)以参与导入处理。

也可以看看

The import statement
import语句的语言参考。
包规格
包装的原始规格。自从本文档撰写以来,一些语义已经改变。根据sys.modules中的None重定向)。
__import__()函数
import语句是此函数的语法糖。
PEP 235
在不区分大小写的平台上导入
PEP 263
定义Python源代码编码
PEP 302
新导入钩
PEP 328
导入:多行和绝对/相对
PEP 366
主模块显式相对导入
PEP 420
隐式命名空间包
PEP 451
导入系统的ModuleSpec类型
PEP 488
消除PYO文件
PEP 489
多阶段扩展模块初始化
PEP 3120
使用UTF-8作为默认源代码
PEP 3147
PYC存储库目录

31.5.2. Functions

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)

内建__import__()函数的实现。

注意

程序化导入模块应使用import_module()而不是此函数。

importlib.import_module(name, package=None)

导入模块。name参数指定要以绝对或相对术语导入的模块。pkg.mod..mod)。如果名称是以相对术语指定的,则参数必须设置为包的名称,该名称将作为解析包名称的锚点。import_module('.. mod', 'pkg.subpkg')将导入pkg.mod)。

import_module()函数用作importlib.__import__()的简化包装。这意味着函数的所有语义都派生自importlib.__import__()这两个函数最重要的区别是import_module()返回指定的包或模块(例如,pkg.mod),而__import__()返回顶级包或模块pkg)。

如果您动态导入自解析器开始执行后创建的模块(例如,创建了一个Python源文件),则可能需要调用invalidate_caches()才能注意到新模块由进口系统。

在版本3.3中更改:父包会自动导入。

importlib.find_loader(name, path=None)

找到模块的加载器,可选择在指定的路径中。如果模块在sys.modules中,则返回sys.modules[name].__loader__(除非加载器None未设置,在这种情况下会引发ValueError)。否则,使用sys.meta_path的搜索完成。如果未找到加载程序,则返回None

点名称没有父级的隐式导入,因为需要加载它们,这可能不是所希望的。要正确导入子模块,您需要导入子模块的所有父包,并使用正确的参数path

版本3.3中的新功能。

在版本3.4中更改:如果__loader__未设置,则引发ValueError,就像属性设置为None

自版本3.4后弃用:改用importlib.util.find_spec()

importlib.invalidate_caches()

使存储在sys.meta_path的finder的内部缓存无效。如果finder实现invalidate_caches(),那么它将被调用以执行无效。如果在程序运行时创建/安装了任何模块,则应调用此函数,以确保所有查找程序都注意到新模块的存在。

版本3.3中的新功能。

importlib.reload(module)

重新载入先前导入的模块参数必须是一个模块对象,因此必须先被成功导入。如果您已使用外部编辑器编辑了模块源文件,并希望在不离开Python解释器的情况下尝试新版本,这将非常有用。返回值是模块对象(如果重新导入会导致将不同的对象放置在sys.modules中,则可能不同)。

当执行reload()时:

  • Python模块的代码被重新编译并重新执行模块级代码,通过重用最初加载模块的loader来定义一组新的对象,这些对象被绑定到模块字典中的名称。扩展模块的init功能不再第二次调用。
  • 与Python中的所有其他对象一样,旧对象只有在引用计数下降到零后才被回收。
  • 模块命名空间中的名称将更新为指向任何新的或已更改的对象。
  • 对旧对象的其他引用(例如模块外部的名称)不会重新引用来引用新对象,如果需要,必须在每个命名空间中对其进行更新。

还有一些其他警告:

当模块被重新加载时,它的字典(包含模块的全局变量)被保留。名称的重定义将覆盖旧的定义,因此这通常不是问题。如果模块的新版本未定义由旧版本定义的名称,则旧定义将保留。如果它维护一个全局表或对象缓存,使用try语句可以测试表的存在并跳过其初始化,如果需要,这个特性可以用于模块的优势:

try:
    cache
except NameError:
    cache = {}

重新加载内建或动态加载的模块通常不是很有用。不建议重新加载sys__main__builtins和其他关键模块。在许多情况下,扩展模块不会被设计为初始化多次,并且可能在重新加载时以任意方式失败。

如果模块使用from ... import ...从另一个模块导入对象,则对其他模块调用reload()其中一个方法是重新执行from语句,另一个方法是使用import和限定名称(module.name t15>)。

如果一个模块实例化一个类的实例,重新加载定义该类的模块不会影响实例的方法定义 - 它们继续使用旧的类定义。对于派生类同样如此。

版本3.4中的新功能。

31.5.3. importlib.abc - 与导入相关的抽象基类

源代码: Lib / importlib / abc.py

importlib.abc模块包含import使用的所有核心抽象基类。还提供了核心抽象基类的一些子类以帮助实现核心ABC。

ABC层次结构:

object
 +-- Finder (deprecated)
 |    +-- MetaPathFinder
 |    +-- PathEntryFinder
 +-- Loader
      +-- ResourceLoader --------+
      +-- InspectLoader          |
           +-- ExecutionLoader --+
                                 +-- FileLoader
                                 +-- SourceLoader
class importlib.abc.Finder

表示finder的抽象基类。

自版本3.3后已弃用:改用了MetaPathFinderPathEntryFinder

abstractmethod find_module(fullname, path=None)

用于为指定模块查找loader的abstact方法。最初在 PEP 302中指定,此方法适用于sys.meta_path和基于路径的导入子系统。

在版本3.4中更改:在调用时返回None,而不是提高NotImplementedError

class importlib.abc.MetaPathFinder

表示meta path finder的抽象基类。为了兼容性,这是Finder的子类。

版本3.3中的新功能。

find_spec(fullname, path, target=None)

用于为指定模块查找spec的抽象方法。如果这是顶级导入,则路径将为None否则,这是搜索子包或模块,路径将是父包中的值__path__如果找不到spec,返回None传入时,target是一个模块对象,取景器可以使用它来更好地了解什么规范返回。

版本3.4中的新功能。

find_module(fullname, path)

用于为指定模块查找loader的传统方法。如果这是顶级导入,则路径将为None否则,这是搜索子包或模块,路径将是父包中的值__path__如果找不到加载器,则返回None

如果定义find_spec(),则提供向后兼容的功能。

在版本3.4中更改:在调用时返回None,而不是提高NotImplementedError可以使用find_spec()提供功能。

自版本3.4后已弃用:改用find_spec()

invalidate_caches()

一种可选方法,在调用时,应使查找程序使用的任何内部缓存失效。在使sys.meta_path上所有查找器的高速缓存无效时由importlib.invalidate_caches()使用。

在版本3.4中更改:在调用时返回None,而不是NotImplemented

class importlib.abc.PathEntryFinder

表示path entry finder的抽象基类。虽然它与MetaPathFinder有一些相似之处,但是PathEntryFinder仅适用于由PathFinder提供的基于路径的导入子系统。由于兼容性原因,此ABC是Finder的子类。

版本3.3中的新功能。

find_spec(fullname, target=None)

用于为指定模块查找spec的抽象方法。查找器将仅在分配给它的path entry中搜索模块。如果找不到spec,返回None传入时,target是一个模块对象,取景器可以使用它来更好地了解什么规范返回。

版本3.4中的新功能。

find_loader(fullname)

用于为指定模块查找loader的传统方法。返回(装载程序, 部分)的2元组,其中portion是一系列文件系统位置命名空间包的一部分。加载程序可以None,同时指定portion以表示文件系统位置对命名空间包的贡献。一个空列表可以用于portion,表示加载程序不是命名空间包的一部分。如果loaderNoneportion是空列表,则没有找到命名空间包的加载器或位置。无法找到模块的任何东西)。

如果定义find_spec(),则提供向后兼容的功能。

在版本3.4中更改:返回(无, []),而不是提高NotImplementedError使用find_spec()可用于提供功能。

自版本3.4后已弃用:改用find_spec()

find_module(fullname)

Finder.find_module()的具体实现,相当于self.find_loader(fullname)[0]

自版本3.4后已弃用:改用find_spec()

invalidate_caches()

一种可选方法,在调用时,应使查找程序使用的任何内部缓存失效。在使所有缓存的查找器的缓存无效时由PathFinder.invalidate_caches()使用。

class importlib.abc.Loader

loader有关装载程序的确切定义,请参见 PEP 302

create_module(spec)

返回在导入模块时要使用的模块对象的方法。此方法可能返回None,表示应该发生默认模块创建语义。

版本3.4中的新功能。

在版本3.5中更改:从Python 3.6开始,当定义exec_module()时,此方法将不可选。

exec_module(module)

在导入或重新加载模块时在其自己的命名空间中执行模块的抽象方法。当调用exec_module()时,该模块应已经初始化。

版本3.4中的新功能。

load_module(fullname)

用于加载模块的传统方法。如果模块无法加载,则会引发ImportError,否则返回加载的模块。

如果请求的模块已经存在于sys.modules中,则应使用并重新加载该模块。否则,加载器应创建一个新模块,并在任何加载开始之前将其插入到sys.modules中,以防止从导入中递归。如果加载程序插入了一个模块,并且加载失败,则必须由加载程序从sys.modules;在加载器开始执行之前已经在sys.modules中的模块应该保留(参见importlib.util.module_for_loader())。

加载器应该在模块上设置几个属性。(请注意,在重新加载模块时,某些属性可能会更改):

exec_module()可用时,提供向后兼容的功能。

在版本3.4中更改:在调用时调用ImportError,而不是NotImplementedErrorexec_module()可用时提供的功能。

自版本3.4后已弃用:用于加载模块的建议API为exec_module()(和create_module())。装载器应该实现它,而不是load_module()。当执行exec_module()时,导入机制负责load_module()的所有其他职责。

module_repr(module)

一个遗留的方法,当实现计算和返回给定的模块的repr,作为一个字符串。模块类型的默认repr()将适当地使用此方法的结果。

版本3.3中的新功能。

在版本3.4中更改:使用可选代替抽象方法。

自从版本3.4起已弃用:导入机制现在自动处理此问题。

class importlib.abc.ResourceLoader

loader的抽象基类,其实现用于从存储后端加载任意资源的可选 PEP 302协议。

abstractmethod get_data(path)

用于返回位于路径的数据的字节的抽象方法。具有类文件存储后端,允许存储任意数据的加载器可以实现此抽象方法,以直接访问存储的数据。如果无法找到路径,则会引发OSError路径应使用模块的__file__属性或包的__path__中的项目构建。

在版本3.4中更改:引发OSError,而不是NotImplementedError

class importlib.abc.InspectLoader

loader的抽象基类,为检查模块的加载器实现可选的 PEP 302协议。

get_code(fullname)

返回模块的代码对象,如果模块没有代码对象,则返回None(例如,对于内建模块来说)。如果loader无法找到请求的模块,则引发ImportError

注意

虽然该方法具有默认实现,但建议如果性能尽可能被覆盖。

在版本3.4中更改:不再抽象,并提供了具体的实现。

abstractmethod get_source(fullname)

返回模块源的抽象方法。它使用universal newlines作为文本字符串返回,将所有识别的行分隔符转换为'\n'字符。返回None如果没有可用的源(例如,内建模块)。如果加载程序找不到指定的模块,则引发ImportError

在版本3.4中更改:引发ImportError而不是NotImplementedError

is_package(fullname)

一个抽象方法,如果模块是一个包,返回一个真值,否则为false值。如果loader找不到模块,则会引发ImportError

在版本3.4中更改:引发ImportError而不是NotImplementedError

static source_to_code(data, path='<string>')

从Python源代码创建代码对象。

数据参数可以是compile()函数支持字符串或字节)。path参数应该是源代码源代码的“路径”,它可以是一个抽象概念(例如,位置在zip文件)。

随后的代码对象可以通过运行exec(code, module .__ dict __)在模块中执行。

版本3.4中的新功能。

在版本3.5中更改:使方法静态。

exec_module(module)

实现Loader.exec_module()

版本3.4中的新功能。

load_module(fullname)

实现Loader.load_module()

自版本3.4之后已弃用:改用了exec_module()

class importlib.abc.ExecutionLoader

继承自InspectLoader的抽象基类,在实现时有助于将模块作为脚本执行。ABC表示可选的 PEP 302协议。

abstractmethod get_filename(fullname)

一个抽象方法,返回指定模块的__file__的值。如果没有路径可用,则会引发ImportError

如果源代码可用,则该方法应返回源文件的路径,而不管是否使用字节码加载模块。

在版本3.4中更改:引发ImportError而不是NotImplementedError

class importlib.abc.FileLoader(fullname, path)

继承自ResourceLoaderExecutionLoader的抽象基类,提供ResourceLoader.get_data()ExecutionLoader.get_filename()

fullname参数是加载程序要处理的模块的完全解析的名称。路径参数是模块文件的路径。

版本3.3中的新功能。

name

加载器可以处理的模块的名称。

path

模块文件的路径。

load_module(fullname)

调用super的load_module()

自从版本3.4开始弃用:改为使用Loader.exec_module()

abstractmethod get_filename(fullname)

返回path

abstractmethod get_data(path)

路径读为二进制文件,并从中返回字节。

class importlib.abc.SourceLoader

用于实现源(以及可选的字节码)文件加载的抽象基类。该类继承于ResourceLoaderExecutionLoader,需要实现:

这个类定义的抽象方法是添加可选的字节码文件支持。不实现这些可选方法(或使它们引发NotImplementedError)导致加载器只能使用源代码。实现方法允许加载器使用源字节码文件;它不允许在仅提供字节码的情况下进行​​无源加载。字节码文件是通过删除Python编译器的解析步骤来加速加载的优化,因此没有公开特定于字节码的API。

path_stats(path)

可选的抽象方法,返回包含指定路径的元数据的dict支持的字典键是:

  • 'mtime'(必需):表示源代码修改时间的整数或浮点数;
  • 'size'(可选):源代码的字节大小。

忽略字典中的任何其他键,以允许将来的扩展。如果无法处理路径,则会引发OSError

版本3.3中的新功能。

在版本3.4中更改:提高OSError,而不是NotImplementedError

path_mtime(path)

可选的抽象方法,返回指定路径的修改时间。

自版本3.3后已弃用:此方法已弃用,支持path_stats()您不必实现它,但它仍然可用于兼容性目的。如果无法处理路径,则引发OSError

在版本3.4中更改:提高OSError,而不是NotImplementedError

set_data(path, data)

可选的抽象方法,将指定的字节写入文件路径。将自动创建不存在的任何中间目录。

当写入路径失败,因为路径是只读的(errno.EACCES / PermissionError)时,不要传播异常。

在版本3.4中更改:在调用时不再引用NotImplementedError

get_code(fullname)

具体实现InspectLoader.get_code()

exec_module(module)
Concrete implementation of Loader.exec_module().

版本3.4中的新功能。

load_module(fullname)

具体实现Loader.load_module()

自版本3.4后已弃用:改用exec_module()

get_source(fullname)

具体实现InspectLoader.get_source()

is_package(fullname)

具体实现InspectLoader.is_package()当文件扩展名被删除时,如果其文件路径(由ExecutionLoader.get_filename()提供)是名为__init__的文件,则模块被确定为包模块名称本身不以__init__结尾。

31.5.4. importlib.machinery - 进口商和路径挂钩

源代码: Lib / importlib / machinery.py

此模块包含帮助import的各种对象,用于查找和加载模块。

importlib.machinery.SOURCE_SUFFIXES

源代码模块的已识别文件后缀的字符串列表。

版本3.3中的新功能。

importlib.machinery.DEBUG_BYTECODE_SUFFIXES

表示非优化字节码模块的文件后缀的字符串列表。

版本3.3中的新功能。

自版本3.5后已弃用:改用BYTECODE_SUFFIXES

importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

表示优化的字节码模块的文件后缀的字符串列表。

版本3.3中的新功能。

自版本3.5后已弃用:改用BYTECODE_SUFFIXES

importlib.machinery.BYTECODE_SUFFIXES

表示字节码模块的已识别文件后缀的字符串列表(包括前导点)。

版本3.3中的新功能。

在版本3.5中已更改:该值不再依赖于__debug__

importlib.machinery.EXTENSION_SUFFIXES

表示扩展模块的已识别文件后缀的字符串列表。

版本3.3中的新功能。

importlib.machinery.all_suffixes()

返回字符串的组合列表,表示由标准导入机制识别的模块的所有文件后缀。这是一个代码的帮助器,只需要知道文件系统路径是否可能引用一个模块,而不需要任何模块类型的细节(例如,inspect.getmodulename())。

版本3.3中的新功能。

class importlib.machinery.BuiltinImporter

内建模块的importer所有已知的内建模块都列在sys.builtin_module_names中。此类实现importlib.abc.MetaPathFinderimportlib.abc.InspectLoader ABC。

只有这个类定义了类方法,才能减少实例化的需要。

Changed in version 3.5: As part of PEP 489, the builtin importer now implements Loader.create_module() and Loader.exec_module()

class importlib.machinery.FrozenImporter

用于冻结模块的importer此类实现importlib.abc.MetaPathFinderimportlib.abc.InspectLoader ABC。

只有这个类定义了类方法,才能减少实例化的需要。

class importlib.machinery.WindowsRegistryFinder

Finder在Windows注册表中声明的模块。此类实现importlib.abc.Finder ABC。

只有这个类定义了类方法,才能减少实例化的需要。

版本3.3中的新功能。

class importlib.machinery.PathFinder

Finder用于sys.path和包__path__属性。此类实现importlib.abc.MetaPathFinder ABC。

只有这个类定义了类方法,才能减少实例化的需要。

classmethod find_spec(fullname, path=None, target=None)

Class方法尝试为sys.path上的fullname指定的模块找到spec,或者如果定义,在/ t6>。对于每个搜索的路径条目,选中sys.path_importer_cache如果找到非假对象,那么它将用作path entry finder来查找正在搜索的模块。如果在sys.path_importer_cache中找不到条目,​​则会为sys.path_hooks搜索路径条目的finder,如果找到,则存储在sys.path_importer_cache以及查询模块。如果找不到finder,那么None都存储在缓存中并返回。

版本3.4中的新功能。

在版本3.5中更改:如果当前工作目录(由空字符串表示)不再有效,则会返回None,但在sys.path_importer_cache

classmethod find_module(fullname, path=None)

find_spec()周围的旧版封装。

自版本3.4后已弃用:改用find_spec()

classmethod invalidate_caches()

sys.path_importer_cache中存储的所有查找器上调用importlib.abc.PathEntryFinder.invalidate_caches()

在版本3.4中更改:使用当前工作目录''调用sys.path_hooks中的对象。空字符串)。

class importlib.machinery.FileFinder(path, *loader_details)

importlib.abc.PathEntryFinder的具体实现,它缓存来自文件系统的结果。

路径参数是查找程序负责搜索的目录。

loader_details参数是可变数目的2项元组,每个元组包含加载程序和加载程序可识别的文件后缀序列。加载器应该是可调用的,它接受模块名称的两个参数和找到的文件的路径。

finder将根据需要缓存目录内容,使每个模块搜索的stat调用验证缓存不是过时的。因为缓存陈旧性依赖于文件系统的操作系统的状态信息的粒度,所以存在搜索模块,创建新文件,然后搜索新文件表示的模块的潜在竞争条件。如果操作发生得足够快以适应stat调用的粒度,则模块搜索将失败。为了防止发生这种情况,当您动态创建模块时,请确保调用importlib.invalidate_caches()

版本3.3中的新功能。

path

查找程序将搜索的路径。

find_spec(fullname, target=None)

尝试找到规范以处理path中的全名

版本3.4中的新功能。

find_loader(fullname)

尝试查找加载器以处理path中的全名

invalidate_caches()

清除内部缓存。

classmethod path_hook(*loader_details)

返回在sys.path_hooks上使用的闭包的类方法。FileFinder的实例由闭包使用直接给予闭包的路径参数和间接使用loader_details返回。

如果闭包的参数不是现有目录,则会引发ImportError

class importlib.machinery.SourceFileLoader(fullname, path)

通过子类化importlib.abc.FileLoader并提供其他方法的一些具体实现的importlib.abc.SourceLoader的具体实现。

版本3.3中的新功能。

name

此加载程序将处理的模块的名称。

path

源文件的路径。

is_package(fullname)

如果path出现在包中,则返回true。

path_stats(path)

具体实现importlib.abc.SourceLoader.path_stats()

set_data(path, data)

具体实现importlib.abc.SourceLoader.set_data()

load_module(name=None)

具体实现importlib.abc.Loader.load_module()其中指定要加载的模块的名称是可选的。

class importlib.machinery.SourcelessFileLoader(fullname, path)

importlib.abc.FileLoader的具体实现,可以导入字节码文件。没有源代码文件存在)。

请注意,直接使用字节码文件(因此不是源代码文件)会禁止您的模块被所有Python实现或更改字节码格式的新版本的Python使用。

版本3.3中的新功能。

name

加载器将处理的模块的名称。

path

字节码文件的路径。

is_package(fullname)

根据path确定模块是否为包。

get_code(fullname)

返回从path创建的name的代码对象。

get_source(fullname)

返回None,因为使用此加载程序时字节码文件没有源。

load_module(name=None)

具体实现importlib.abc.Loader.load_module()其中指定要加载的模块的名称是可选的。

class importlib.machinery.ExtensionFileLoader(fullname, path)

扩展模块的importlib.abc.ExecutionLoader的具体实现。

fullname参数指定加载程序要支持的模块的名称。路径参数是扩展模块文件的路径。

版本3.3中的新功能。

name

加载器支持的模块名称。

path

扩展模块的路径。

create_module(spec)

根据 PEP 489从给定规范创建模块对象。

版本3.5中的新功能。

exec_module(module)

根据 PEP 489初始化给定的模块对象。

版本3.5中的新功能。

is_package(fullname)

如果文件路径基于EXTENSION_SUFFIXES指向软件包的__init__模块,则返回True

get_code(fullname)

返回None,因为扩展模块缺少代码对象。

get_source(fullname)

返回None,因为扩展模块没有源代码。

get_filename(fullname)

返回path

版本3.4中的新功能。

class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)

模块的导入系统相关状态的规范。

版本3.4中的新功能。

name

__name__

模块的完全限定名称的字符串。

loader

__loader__

装载器用于装载。对于命名空间包,这应该设置为无。

origin

__file__

模块加载地点的名称,例如“builtin”用于内建模块,文件名用于从源加载的模块。通常应该设置“origin”,但它可以是None(默认),表示它未指定。

submodule_search_locations

__path__

用于在哪里找到子模块的字符串列表(如果为包)(否则为None)。

loader_state

容器用于在加载期间使用的特定模块特定数据(或无)。

cached

__cached__

应存储编译模块的字符串(或无)。

parent

__package__

(只读)模块作为子模块所属的包的全限定名(或无)。

has_location

布尔值,指示模块的“origin”属性是否指可装入的位置。

31.5.5. importlib.util - 进口商的实用程序代码

源代码: Lib / importlib / util.py

此模块包含有助于构建importer的各种对象。

importlib.util.MAGIC_NUMBER

表示字节码版本号的字节。如果您需要有关加载/写入字节码的帮助,请考虑importlib.abc.SourceLoader

版本3.4中的新功能。

importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)

PEP 3147 / PEP 488的路径返回到与源路径相关联的字节编译文件例如,如果path/foo/bar/baz.py,则返回值为/foo/bar/__pycache__/baz.cpython-32.pyc for Python 3.2。The cpython-32 string comes from the current magic tag (see get_tag(); if sys.implementation.cache_tag is not defined then NotImplementedError will be raised).

optimization参数用于指定字节码文件的优化级别。空字符串表示无优化,因此使用''优化/foo/bar/baz.py将导致字节码路径/foo/bar/__pycache__/baz.cpython-32.pycNone会导致使用插值器的优化级别。Any other value’s string representation being used, so /foo/bar/baz.py with an optimization of 2 will lead to the bytecode path of /foo/bar/__pycache__/baz.cpython-32.opt-2.pyc. 优化的字符串表示只能是字母数字,否则会引发ValueError

debug_override参数已弃用,可用于覆盖__debug__的系统值。True值等效于将优化设置为空字符串。False值与将优化设置为1相同。如果debug_override优化都不是None,则会引发TypeError

版本3.4中的新功能。

在版本3.5中已更改:添加了优化参数,并且已弃用debug_override参数。

importlib.util.source_from_cache(path)

给定路径 PEP 3147文件名,返回关联的源代码文件路径。例如,如果路径/foo/bar/__pycache__/baz.cpython-32.pyc,则返回的路径为/foo/bar/baz.pypath need not exist, however if it does not conform to PEP 3147 or PEP 488 format, a ValueError is raised. 如果未定义sys.implementation.cache_tag,则会引发NotImplementedError

版本3.4中的新功能。

importlib.util.decode_source(source_bytes)

解码表示源代码的给定字节,并将其作为带有通用换行符的字符串(根据importlib.abc.InspectLoader.get_source())的要求返回。

版本3.4中的新功能。

importlib.util.resolve_name(name, package)

将相对模块名称解析为绝对模块名称。

如果名称没有前导点,则会返回名称这允许使用诸如importlib.util.resolve_name('sys', __ package __),而无需检查package参数。

ValueError is raised if name is a relative module name but package is a false value (e.g. None或空字符串)。ValueError也会引发一个相对名称,以逃避其包含的包。spam包内请求..bacon)。

版本3.3中的新功能。

importlib.util.find_spec(name, package=None)

找到模块的spec(可选地相对于指定的名称)。如果模块在sys.modules中,则返回sys.modules[name].__spec__(除非规范为None未设置,在这种情况下会引发ValueError)。否则,使用sys.meta_path的搜索完成。如果未找到规范,则返回None

如果name是用于子模块(包含点),则会自动导入父模块。

名称的工作方式与import_module()相同。

版本3.4中的新功能。

importlib.util.module_from_spec(spec)

根据specspec.loader.create_module()创建一个新模块。

如果spec.loader.create_module()不返回None,则任何预先存在的属性将不会被重置。此外,如果在访问spec或在模块上设置属性时触发,则不会引发AttributeError

此功能优于使用types.ModuleType创建一个新模块,因为spec用于在模块上设置尽可能多的导入控制属性。

版本3.5中的新功能。

@importlib.util.module_for_loader

用于importlib.abc.Loader.load_module()decorator用于处理选择要加载的正确模块对象。装饰方法期望有一个调用声明取两个位置参数(例如。load_module(self, 模块))第二个参数将成为装载机。注意,装饰器不会在静态方法上工作,因为假设有两个参数。

装饰方法将在loader中按预期加载模块的名称如果在sys.modules中找不到该模块,则构造一个新的模块。无论模块来自哪里,__loader__设置为self__package__是根据importlib.abc.InspectLoader.is_package()返回(如果可用)。这些属性无条件设置以支持重新加载。

如果装饰方法引发了异常,并且向sys.modules添加了一个模块,则模块将被删除,以防止部分初始化的模块位于sys.modules如果模块已在sys.modules中,那么它将被单独保留。

在版本3.3中更改: __loader____package__会自动设置(如果可能)。

在版本3.4中更改:无条件地设置__name____loader__ __package__以支持重新加载。

自版本3.4后已弃用:导入机制现在直接执行此函数提供的所有功能。

@importlib.util.set_loader

用于importlib.abc.Loader.load_module()decorator可在返回的模块上设置__loader__属性。如果属性已经设置,装饰器不执行任何操作。假设包装方法的第一位置参数(即,self)是什么__loader__应设置为。

在版本3.4中更改:如果设置为None,则设置__loader__,如同属性不存在。

自版本3.4后已弃用:导入机制自动处理此问题。

@importlib.util.set_package

importlib.abc.Loader.load_module()中设置decorator以在返回的模块上设置__package__属性。如果__package__设置并且具有除None之外的值,则不会更改。

自版本3.4后已弃用:导入机制自动处理此问题。

importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)

用于根据加载器创建ModuleSpec实例的工厂函数。参数的含义与ModuleSpec相同。该函数使用可用的loader API,例如InspectLoader.is_package()填充规范中缺少的任何信息。

版本3.4中的新功能。

importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)

用于根据文件路径创建ModuleSpec实例的工厂函数。缺少的信息将通过使用加载器API和通过模块将基于文件的意义填充规格。

版本3.4中的新功能。

class importlib.util.LazyLoader(loader)

延迟模块的加载器的执行直到模块具有访问的属性的类。

此类与定义exec_module()的装载器配合使用,用于控制模块所使用的模块类型。由于同样的原因,加载器的create_module()方法将被忽略(即,加载器的方法应该只返回None;这不包括BuiltinImporter ExtensionFileLoader)。最后,替换放置在sys.modules中的对象的模块将不工作,因为没有办法在安全地正确替换整个解释器中的模块引用;如果检测到此类替换,则会引发ValueError

注意

对于启动时间至关重要的项目,该类允许在不使用模块的情况下最小化加载模块的成本。对于启动时间不是必需的项目,则使用此类是严重不鼓励,因为在加载期间创建的错误消息被推迟,因此在上下文之外发生。

版本3.5中的新功能。

classmethod factory(loader)

一个静态方法,返回一个可调用,创建一个延迟加载器。这意味着在加载器通过类而不是实例传递的情况下使用。

suffixes = importlib.machinery.SOURCE_SUFFIXES
loader = importlib.machinery.SourceFileLoader
lazy_loader = importlib.util.LazyLoader.factory(loader)
finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))