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_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
的 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 版本中新增。