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__)

这将添加到包的 __path__ 上目录的所有子目录 sys.path 以包命名。如果要将单个逻辑包的不同部分作为多个目录分发,则此功能非常有用。

它也在寻找 *.pkg 文件起始位置 * 匹配 name 参数。此功能类似于 *.pth 文件(见 site 模块获取更多信息),但它不是以 import . 一 *.pkg 文件的面值是可信的:除了检查重复项之外,在 *.pkg 文件被添加到路径中,不管它们是否存在于文件系统中。(这是一项功能。)

如果输入路径不是一个列表(就像冻结包的情况一样),它将原封不动地返回。未修改输入路径;返回扩展副本。项目仅在末尾附加到副本。

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

class pkgutil.ImpImporter(dirname=None)

PEP 302 包含python的“经典”导入算法的finder。

如果 目录名 是一个字符串 PEP 302 会创建搜索该目录的finder。如果 目录名None ,A PEP 302 创建搜索当前 sys.path 以及任何冻结或内置的模块。

注意 ImpImporter 当前不支持上的位置正在使用 sys.meta_path .

3.3 版后已移除: 不再需要这种模拟,因为标准导入机制现在已经完全 PEP 302 符合要求,可在 importlib .

class pkgutil.ImpLoader(fullname, file, filename, etc)

Loader 它包装了Python的“经典”导入算法。

3.3 版后已移除: 不再需要这种模拟,因为标准导入机制现在已经完全 PEP 302 符合要求,可在 importlib .

pkgutil.find_loader(fullname)

检索模块 loader 对于给定的 全名 .

这是一个向后兼容性封装器 importlib.util.find_spec() 将大多数失败转化为 ImportError 只返回加载器而不是完整的 ModuleSpec .

在 3.3 版更改: 更新为直接基于 importlib 而不是依赖包内部 PEP 302 导入仿真。

在 3.4 版更改: 更新为基于 PEP 451

pkgutil.get_importer(path_item)

检索一个 finder 对于给定的 path_item .

返回的查找程序缓存在 sys.path_importer_cache 如果它是由路径挂钩新创建的。

如果重新扫描 sys.path_hooks 是必要的。

在 3.3 版更改: 更新为直接基于 importlib 而不是依赖包内部 PEP 302 导入仿真。

pkgutil.get_loader(module_or_name)

得到一个 loader 对象 module_or_name .

如果模块或包可以通过正常的导入机制访问,则返回该机器相关部分的封装。返回 None 如果找不到或无法导入模块。如果命名模块尚未导入,则导入其包含的包(如果有),以便建立包 __path__ .

在 3.3 版更改: 更新为直接基于 importlib 而不是依赖包内部 PEP 302 导入仿真。

在 3.4 版更改: 更新为基于 PEP 451

pkgutil.iter_importers(fullname='')

finder 给定模块名的对象。

如果fullname包含“.”,则查找程序将用于包含fullname的包,否则它们将是所有注册的顶级查找程序(即sys.meta_path和sys.path_hooks上的查找程序)。

如果命名模块在包中,则作为调用此函数的副作用导入该包。

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

在 3.3 版更改: 更新为直接基于 importlib 而不是依赖包内部 PEP 302 导入仿真。

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

产量 ModuleInfo 对于上的所有子模块 path ,或者,如果 pathNone ,所有顶级模块打开 sys.path .

path 应该是 None 或查找模块的路径列表。

前缀 在输出的每个模块名称的前面输出的字符串。

注解

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

在 3.3 版更改: 更新为直接基于 importlib 而不是依赖包内部 PEP 302 导入仿真。

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

产量 ModuleInfo 对于所有模块递归 path ,或者,如果 pathNone ,所有可访问的模块。

path 应该是 None 或查找模块的路径列表。

前缀 在输出的每个模块名称的前面输出的字符串。

请注意,此函数必须导入所有 封装not 所有模块!关于给定 path ,以便访问 __path__ 属性来查找子模块。

出错 如果在尝试导入包时发生异常,则使用一个参数(正在导入的包的名称)调用的函数。如果没有 出错 提供了函数, ImportError 捕获并忽略s,同时传播所有其他异常,终止搜索。

实例:

# list all modules python can access
walk_packages()

# list all submodules of ctypes
walk_packages(ctypes.__path__, ctypes.__name__ + '.')

注解

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

在 3.3 版更改: 更新为直接基于 importlib 而不是依赖包内部 PEP 302 导入仿真。

pkgutil.get_data(package, resource)

从包中获取资源。

这是一个封装 loader get_data 应用程序编程接口。这个 包裹 参数应为标准模块格式的包的名称。 (foo.bar). The resource argument should be in the form of a relative filename, using / as the path separator. The parent directory name .. 不允许,也不是根名称(以 /

函数返回一个二进制字符串,该字符串是指定资源的内容。

对于文件系统中已导入的包,大致相当于:

d = os.path.dirname(sys.modules[package].__file__)
data = open(os.path.join(d, resource), 'rb').read()

如果无法定位或加载包,或者它使用 loader 它不支持 get_data 然后 None 返回。尤其是, loader 对于 namespace packages 不支持 get_data .

pkgutil.resolve_name(name)

将名称解析为对象。

此功能在标准库中的许多地方使用(请参见 bpo-12915 )-在广泛使用的第三方软件包(如setuptools、Django和Pyramid)中也有类似的功能。

预计 name 将是以下格式之一的字符串,其中W是有效Python标识符的简写,dot表示这些伪正则表达式中的文字句点:

  • W(.W)*

  • W(.W)*:(W(.W)*)?

第一种形式仅用于向后兼容。它假设虚线名称的某些部分是一个包,其余部分是该包中的某个对象,可能嵌套在其他对象中。由于检查无法推断包停止和对象层次结构开始的位置,因此必须使用此表单重复尝试导入。

在第二种形式中,调用者通过提供一个冒号来明确划分点:冒号左边的虚线名称是要导入的包,右边的虚线名称是该包中的对象层次结构。此表单中只需要一个导入。如果以冒号结尾,则返回模块对象。

函数将返回一个对象(可能是模块),或引发以下异常之一:

ValueError ——如果 name 不是公认的格式。

ImportError --如果一个导入在不应该的时候失败了。

AttributeError --如果在导入的包中遍历对象层次结构以获取所需对象时失败。

3.9 新版功能.