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
.
- pkgutil.find_loader(fullname)¶
检索模块 loader 对于给定的 全名 .
这是一个向后兼容性封装器
importlib.util.find_spec()
将大多数失败转化为ImportError
只返回加载器而不是完整的ModuleSpec
.在 3.4 版更改: 更新为基于 PEP 451
- pkgutil.get_importer(path_item)¶
检索一个 finder 对于给定的 path_item .
返回的查找程序缓存在
sys.path_importer_cache
如果它是由路径挂钩新创建的。如果重新扫描
sys.path_hooks
是必要的。
- pkgutil.get_loader(module_or_name)¶
得到一个 loader 对象 module_or_name .
如果模块或包可以通过正常的导入机制访问,则返回该机器相关部分的封装。返回
None
如果找不到或无法导入模块。如果命名模块尚未导入,则导入其包含的包(如果有),以便建立包__path__
.在 3.4 版更改: 更新为基于 PEP 451
- pkgutil.iter_importers(fullname='')¶
让 finder 给定模块名的对象。
如果fullname包含“.”,则查找程序将用于包含fullname的包,否则它们将是所有注册的顶级查找程序(即sys.meta_path和sys.path_hooks上的查找程序)。
如果命名模块在包中,则作为调用此函数的副作用导入该包。
如果未指定模块名称,则生成所有顶级查找器。
- pkgutil.iter_modules(path=None, prefix='')¶
产量
ModuleInfo
对于上的所有子模块 path ,或者,如果 path 是None
,所有顶级模块打开sys.path
.path 应该是
None
或查找模块的路径列表。前缀 在输出的每个模块名称的前面输出的字符串。
注解
只适用于 finder 它定义了
iter_modules()
方法。此接口是非标准的,因此模块还提供importlib.machinery.FileFinder
和zipimport.zipimporter
.
- pkgutil.walk_packages(path=None, prefix='', onerror=None)¶
产量
ModuleInfo
对于所有模块递归 path ,或者,如果 path 是None
,所有可访问的模块。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.FileFinder
和zipimport.zipimporter
.
- 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 新版功能.