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中的新功能。
- Python模块的代码被重新编译并重新执行模块级代码,通过重用最初加载模块的loader来定义一组新的对象,这些对象被绑定到模块字典中的名称。扩展模块的
31.5.3. importlib.abc
- 与导入相关的抽象基类¶
importlib.abc
模块包含import
使用的所有核心抽象基类。还提供了核心抽象基类的一些子类以帮助实现核心ABC。
ABC层次结构:
object
+-- Finder (deprecated)
| +-- MetaPathFinder
| +-- PathEntryFinder
+-- Loader
+-- ResourceLoader --------+
+-- InspectLoader |
+-- ExecutionLoader --+
+-- FileLoader
+-- SourceLoader
- class
importlib.abc.
Finder
¶ 表示finder的抽象基类。
自版本3.3后已弃用:改用了
MetaPathFinder
或PathEntryFinder
。- abstractmethod
find_module
(fullname, path=None)¶ 用于为指定模块查找loader的abstact方法。最初在 PEP 302中指定,此方法适用于
sys.meta_path
和基于路径的导入子系统。在版本3.4中更改:在调用时返回
None
,而不是提高NotImplementedError
。
- abstractmethod
- 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
,表示加载程序不是命名空间包的一部分。如果loader
是None
和portion
是空列表,则没有找到命名空间包的加载器或位置。无法找到模块的任何东西)。如果定义
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()
)。加载器应该在模块上设置几个属性。(请注意,在重新加载模块时,某些属性可能会更改):
__name__
模块的名称。
__file__
存储模块数据的路径(不为内建模块设置)。
__cached__
应该存储模块的编译版本/应存储的路径(在属性不合适时不设置)。
__path__
指定包内搜索路径的字符串列表。此属性不在模块上设置。
__package__
模块/包的父包。如果模块是顶层,那么它具有空字符串的值。
importlib.util.module_for_loader()
装饰可以处理__package__
的详细信息。
__loader__
用于加载模块的加载器。
importlib.util.module_for_loader()
装饰可以处理__package__
的详细信息。
当
exec_module()
可用时,提供向后兼容的功能。在版本3.4中更改:在调用时调用
ImportError
,而不是NotImplementedError
。当exec_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
¶
- 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)¶ 版本3.4中的新功能。
-
load_module
(fullname)¶ 自版本3.4之后已弃用:改用了
exec_module()
。
-
- class
importlib.abc.
ExecutionLoader
¶ 继承自
InspectLoader
的抽象基类,在实现时有助于将模块作为脚本执行。ABC表示可选的 PEP 302协议。- abstractmethod
get_filename
(fullname)¶ 一个抽象方法,返回指定模块的
__file__
的值。如果没有路径可用,则会引发ImportError
。如果源代码可用,则该方法应返回源文件的路径,而不管是否使用字节码加载模块。
在版本3.4中更改:引发
ImportError
而不是NotImplementedError
。
- abstractmethod
- class
importlib.abc.
FileLoader
(fullname, path)¶ 继承自
ResourceLoader
和ExecutionLoader
的抽象基类,提供ResourceLoader.get_data()
和ExecutionLoader.get_filename()
。fullname参数是加载程序要处理的模块的完全解析的名称。路径参数是模块文件的路径。
版本3.3中的新功能。
-
name
¶ 加载器可以处理的模块的名称。
-
path
¶ 模块文件的路径。
-
load_module
(fullname)¶ 调用super的
load_module()
。自从版本3.4开始弃用:改为使用
Loader.exec_module()
。
- abstractmethod
get_data
(path)¶ 将路径读为二进制文件,并从中返回字节。
-
- class
importlib.abc.
SourceLoader
¶ 用于实现源(以及可选的字节码)文件加载的抽象基类。该类继承于
ResourceLoader
和ExecutionLoader
,需要实现:ExecutionLoader.get_filename()
应该只返回源文件的路径;不支持无源加载。
这个类定义的抽象方法是添加可选的字节码文件支持。不实现这些可选方法(或使它们引发
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)¶
-
exec_module
(module)¶ - Concrete implementation of
Loader.exec_module()
.版本3.4中的新功能。
-
load_module
(fullname)¶ 具体实现
Loader.load_module()
。自版本3.4后已弃用:改用
exec_module()
。
-
get_source
(fullname)¶
-
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.MetaPathFinder
和importlib.abc.InspectLoader
ABC。只有这个类定义了类方法,才能减少实例化的需要。
Changed in version 3.5: As part of PEP 489, the builtin importer now implements
Loader.create_module()
andLoader.exec_module()
- class
importlib.machinery.
FrozenImporter
¶ 用于冻结模块的importer。此类实现
importlib.abc.MetaPathFinder
和importlib.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
中的对象。空字符串)。- classmethod
- class
importlib.machinery.
FileFinder
(path, *loader_details)¶ importlib.abc.PathEntryFinder
的具体实现,它缓存来自文件系统的结果。路径参数是查找程序负责搜索的目录。
loader_details参数是可变数目的2项元组,每个元组包含加载程序和加载程序可识别的文件后缀序列。加载器应该是可调用的,它接受模块名称的两个参数和找到的文件的路径。
finder将根据需要缓存目录内容,使每个模块搜索的stat调用验证缓存不是过时的。因为缓存陈旧性依赖于文件系统的操作系统的状态信息的粒度,所以存在搜索模块,创建新文件,然后搜索新文件表示的模块的潜在竞争条件。如果操作发生得足够快以适应stat调用的粒度,则模块搜索将失败。为了防止发生这种情况,当您动态创建模块时,请确保调用
importlib.invalidate_caches()
。版本3.3中的新功能。
-
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
¶ 源文件的路径。
-
path_stats
(path)¶
-
set_data
(path, 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
¶ 字节码文件的路径。
-
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
¶ 扩展模块的路径。
-
is_package
(fullname)¶ 如果文件路径基于
EXTENSION_SUFFIXES
指向软件包的__init__
模块,则返回True
。
-
get_code
(fullname)¶ 返回
None
,因为扩展模块缺少代码对象。
-
get_source
(fullname)¶ 返回
None
,因为扩展模块没有源代码。
-
- 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。Thecpython-32
string comes from the current magic tag (seeget_tag()
; ifsys.implementation.cache_tag
is not defined thenNotImplementedError
will be raised).optimization参数用于指定字节码文件的优化级别。空字符串表示无优化,因此使用
''
的优化的/foo/bar/baz.py
将导致字节码路径/foo/bar/__pycache__/baz.cpython-32.pyc
。None
会导致使用插值器的优化级别。Any other value’s string representation being used, so/foo/bar/baz.py
with an optimization of2
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.py
。path need not exist, however if it does not conform to PEP 3147 or PEP 488 format, aValueError
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)¶ 根据spec和
spec.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))
- classmethod