pkgutil
— 包扩展实用工具¶
源代码: Lib/pkgutil.py
此模块为导入系统提供实用工具,特别是包支持。
- class pkgutil.ModuleInfo(module_finder, name, ispkg)¶
一个 namedtuple,用于保存模块信息的简短摘要。
3.6 版本新增。
- pkgutil.extend_path(path, name)¶
扩展构成包的模块的搜索路径。预期用途是将以下代码放置在包的
__init__.py
中from pkgutil import extend_path __path__ = extend_path(__path__, __name__)
对于
sys.path
上具有与包名称匹配的子目录的每个目录,将子目录添加到包的__path__
。如果想要将单个逻辑包的不同部分作为多个目录分发,这将非常有用。它还会查找以
*.pkg
开头的文件,其中*
与 name 参数匹配。此功能类似于*.pth
文件(有关详细信息,请参阅site
模块),不同之处在于它不会特殊处理以import
开头的行。*.pkg
文件被认为是可信的:除了跳过空行和忽略注释之外,在*.pkg
文件中找到的所有条目都会添加到路径中,无论它们是否存在于文件系统上(这是一个功能)。如果输入路径不是列表(对于冻结包就是这种情况),则返回不变的路径。不会修改输入路径;会返回扩展副本。项目仅在末尾追加到副本中。
假设
sys.path
是一个序列。sys.path
中不是引用现有目录的字符串的项目将被忽略。sys.path
中作为文件名使用时会导致错误的 Unicode 项目可能会导致此函数引发异常(与os.path.isdir()
行为一致)。
- pkgutil.find_loader(fullname)¶
检索给定 fullname 的模块 加载器。
这是
importlib.util.find_spec()
周围的向后兼容性包装器,它将大多数失败转换为ImportError
,并且仅返回加载器,而不是完整的importlib.machinery.ModuleSpec
。3.4 版本更改: 已更新为基于 PEP 451
3.12 版本中已弃用, 将在 3.14 版本中删除: 请改用
importlib.util.find_spec()
。
- pkgutil.get_importer(path_item)¶
检索给定 path_item 的 查找器。
如果返回的查找器是由路径钩子新创建的,则会将其缓存在
sys.path_importer_cache
中。如果需要重新扫描
sys.path_hooks
,可以手动清除缓存(或其中的一部分)。
- pkgutil.get_loader(module_or_name)¶
获取 module_or_name 的 加载器 对象。
如果可以通过正常的导入机制访问模块或包,则会返回该机制的相关部分的包装器。如果找不到或无法导入模块,则返回
None
。如果尚未导入命名模块,则会导入其包含的包(如果有),以便建立包__path__
。3.4 版本更改: 已更新为基于 PEP 451
3.12 版本中已弃用, 将在 3.14 版本中删除: 请改用
importlib.util.find_spec()
。
- pkgutil.iter_importers(fullname='')¶
为给定的模块名称生成 查找器 对象。
如果 fullname 包含
'.'
,则查找器将用于包含 fullname 的包,否则它们将是所有注册的顶级查找器(即sys.meta_path
和sys.path_hooks
上的查找器)。如果命名模块位于包中,则调用此函数会作为副作用导入该包。
如果未指定模块名称,则会生成所有顶级查找器。
- pkgutil.iter_modules(path=None, prefix='')¶
为 path 上的所有子模块生成
ModuleInfo
。如果 path 为None
,则为sys.path
上的所有顶级模块生成ModuleInfo
。path 应该是
None
或用于查找模块的路径列表。prefix 是一个字符串,用于输出时添加到每个模块名称的前面。
注意
仅适用于定义了
iter_modules()
方法的 查找器。此接口为非标准接口,因此该模块还为importlib.machinery.FileFinder
和zipimport.zipimporter
提供了实现。
- pkgutil.walk_packages(path=None, prefix='', onerror=None)¶
为 path 上的所有模块递归生成
ModuleInfo
,如果 path 为None
,则为所有可访问的模块生成。path 应该是
None
或用于查找模块的路径列表。prefix 是一个字符串,用于输出时添加到每个模块名称的前面。
请注意,此函数必须导入给定 path 上的所有包(不是所有模块!),以便访问
__path__
属性来查找子模块。如果尝试导入包时发生任何异常,则会调用 onerror 函数,该函数接受一个参数(正在导入的包的名称)。如果没有提供 onerror 函数,则
ImportError
会被捕获并忽略,而所有其他异常都会传播,从而终止搜索。示例
# list all modules python can access walk_packages() # list all submodules of ctypes walk_packages(ctypes.__path__, ctypes.__name__ + '.')
注意
仅适用于定义了
iter_modules()
方法的 查找器。此接口为非标准接口,因此该模块还为importlib.machinery.FileFinder
和zipimport.zipimporter
提供了实现。
- pkgutil.get_data(package, resource)¶
从包中获取资源。
这是 加载器
get_data
API 的包装器。package 参数应为包的名称,采用标准模块格式(foo.bar
)。resource 参数应采用相对文件名的形式,使用/
作为路径分隔符。不允许使用父目录名称..
,也不允许使用根名称(以/
开头)。该函数返回一个二进制字符串,该字符串是指定资源的内容。
对于位于文件系统中且已导入的包,这大致等同于
d = os.path.dirname(sys.modules[package].__file__) data = open(os.path.join(d, resource), 'rb').read()
如果无法定位或加载包,或者它使用了不支持
get_data
的 加载器,则返回None
。特别是,命名空间包 的 加载器 不支持get_data
。
- pkgutil.resolve_name(name)¶
将名称解析为对象。
此功能在标准库的许多地方使用(请参阅 bpo-12915) - 并且在诸如 setuptools、Django 和 Pyramid 等广泛使用的第三方包中也存在等效功能。
预期 name 将是一个字符串,采用以下格式之一,其中 W 是有效 Python 标识符的缩写,点是这些伪正则表达式中的文字句点
W(.W)*
W(.W)*:(W(.W)*)?
第一种形式仅用于向后兼容。它假定点名称的某些部分是一个包,其余部分是该包内的某个位置的对象,可能嵌套在其他对象内部。由于无法通过检查推断包停止的位置和对象层次结构开始的位置,因此必须使用此形式重复尝试导入。
在第二种形式中,调用者通过提供单个冒号来明确划分点:冒号左侧的点名称是要导入的包,冒号右侧是该包内的对象层次结构。此形式只需要一个导入。如果它以冒号结尾,则返回模块对象。
该函数将返回一个对象(可能是模块),或引发以下异常之一
ValueError
– 如果 name 的格式无法识别。ImportError
– 如果在不应该发生时导入失败。AttributeError
– 如果在遍历导入的包中的对象层次结构以获取所需对象时发生故障。在 3.9 版本中添加。