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_item 的 finder。
如果返回的查找器是由路径钩子新创建的,则它会缓存到
sys.path_importer_cache中。如果需要重新扫描
sys.path_hooks,可以手动清除缓存(或其一部分)。
- pkgutil.iter_importers(fullname='')¶
为给定模块名生成 finder 对象。
如果 fullname 包含
'.',则查找器将用于包含 fullname 的包,否则它们将是所有已注册的顶级查找器(即sys.meta_path和sys.path_hooks上的)。如果指定名称的模块位于某个包中,则调用此函数会作为副作用导入该包。
如果未指定模块名称,则会生成所有顶级查找器。
- pkgutil.iter_modules(path=None, prefix='')¶
为 path 上的所有子模块,或者如果 path 为
None,则为sys.path上的所有顶级模块生成ModuleInfo。path 应该为
None或一个包含模块搜索路径的列表。prefix 是一个字符串,用于在输出时添加到每个模块名称的前面。
备注
仅适用于定义了
iter_modules()方法的 finder。此接口非标准,因此模块还为importlib.machinery.FileFinder和zipimport.zipimporter提供了实现。
- pkgutil.walk_packages(path=None, prefix='', onerror=None)¶
为 path 上所有递归模块,或者如果 path 为
None,则为所有可访问模块生成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.FileFinder和zipimport.zipimporter提供了实现。
- pkgutil.get_data(package, resource)¶
从包中获取资源。
这是 loader
get_dataAPI 的包装器。 package 参数应该是包的名称,采用标准模块格式(foo.bar)。 resource 参数应采用相对文件名形式,使用/作为路径分隔符。不允许使用父目录名称..,也不允许使用根名称(以/开头)。该函数返回一个二进制字符串,即指定资源的内容。
对于已导入的文件系统中的包,这大致相当于
d = os.path.dirname(sys.modules[package].__file__) data = open(os.path.join(d, resource), 'rb').read()
如果无法找到或加载包,或者它使用不支持
get_data的 loader,则返回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 版本中新增。