pkgutil — 包扩展实用程序

源代码: Lib/pkgutil.py


此模块为导入系统提供实用程序,特别是包支持。

class pkgutil.ModuleInfo(module_finder, name, ispkg)

一个命名元组,包含模块信息的简要摘要。

在 3.6 版本加入。

pkgutil.extend_path(path, name)

扩展组成包的模块的搜索路径。预期用途是将以下代码放在包的 __init__.py

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

对于 sys.path 上的每个目录,如果它有一个与包名匹配的子目录,则将该子目录添加到包的 __path__ 中。这在需要将单个逻辑包的不同部分作为多个目录分发时很有用。

它还会查找以 * 匹配 name 参数的 *.pkg 文件。此功能类似于 *.pth 文件(有关更多信息,请参阅 site 模块),只是它不会特殊处理以 import 开头的行。 *.pkg 文件被视为真实文件:除了跳过空行和忽略注释外, *.pkg 文件中找到的所有条目都会添加到路径中,无论它们是否存在于文件系统上(这是一个功能)。

如果输入路径不是列表(如冻结包的情况),则原样返回。输入路径不会被修改;而是返回一个扩展副本。项目只会被追加到副本的末尾。

假定 sys.path 是一个序列。 sys.path 中不是引用现有目录的字符串的项目将被忽略。 sys.path 上的 Unicode 项目在用作文件名时可能导致错误,这可能导致此函数引发异常(与 os.path.isdir() 行为一致)。

pkgutil.get_importer(path_item)

检索给定 path_itemfinder

如果返回的查找器是由路径钩子新创建的,则它会缓存到 sys.path_importer_cache 中。

如果需要重新扫描 sys.path_hooks,可以手动清除缓存(或其一部分)。

3.3 版本发生变更: 更新为直接基于 importlib,而不是依赖包内部的 PEP 302 导入模拟。

pkgutil.iter_importers(fullname='')

为给定模块名生成 finder 对象。

如果 fullname 包含 '.',则查找器将用于包含 fullname 的包,否则它们将是所有已注册的顶级查找器(即 sys.meta_pathsys.path_hooks 上的)。

如果指定名称的模块位于某个包中,则调用此函数会作为副作用导入该包。

如果未指定模块名称,则会生成所有顶级查找器。

3.3 版本发生变更: 更新为直接基于 importlib,而不是依赖包内部的 PEP 302 导入模拟。

pkgutil.iter_modules(path=None, prefix='')

path 上的所有子模块,或者如果 pathNone,则为 sys.path 上的所有顶级模块生成 ModuleInfo

path 应该为 None 或一个包含模块搜索路径的列表。

prefix 是一个字符串,用于在输出时添加到每个模块名称的前面。

备注

仅适用于定义了 iter_modules() 方法的 finder。此接口非标准,因此模块还为 importlib.machinery.FileFinderzipimport.zipimporter 提供了实现。

3.3 版本发生变更: 更新为直接基于 importlib,而不是依赖包内部的 PEP 302 导入模拟。

pkgutil.walk_packages(path=None, prefix='', onerror=None)

path 上所有递归模块,或者如果 pathNone,则为所有可访问模块生成 ModuleInfo

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() 方法的 finder。此接口非标准,因此模块还为 importlib.machinery.FileFinderzipimport.zipimporter 提供了实现。

3.3 版本发生变更: 更新为直接基于 importlib,而不是依赖包内部的 PEP 302 导入模拟。

pkgutil.get_data(package, resource)

从包中获取资源。

这是 loader 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_dataloader,则返回 None。特别是,命名空间包loader 不支持 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 版本中新增。