– 包扩展实用程序 – 导入模块(Python教程)(参考资料)
pkgutil– 包扩展实用程序
源代码: Lib / pkgutil.py
此模块为导入系统提供实用程序,特别是packagesupport .
pkgutil.extend_path(path, name)-
扩展组成包的模块的搜索路径。intendeduse是将以下代码放在包的
__init__.py:from pkgutil import extend_path__path__ = extend_path(__path__, __name__)
这将添加到包的
__path__目录的所有子目录sys.path以包命名。如果想要将单个逻辑包的不同部分分配为多重编码,这很有用.它还会查找
*.pkg文件,其中*与name参数匹配。此功能类似于*.pth文件(参见site模块以获取更多信息),除了它没有以import开头的特殊情况。*.pkg文件在facevalue中受信任:除了检查重复项之外,*.pkg文件被添加到路径中,无论它们是否存在于文件系统中。(这是一个特色。)如果输入路径不是列表(如冷冻包的情况),则返回不变。输入路径未修改;遗弃的副本。项目最后只附在副本上
假设
sys.path是一个序列。sys.path的项目不是指向现有目录的字符串,将被忽略。//上的Unicodeitemssys.path当用作文件名时导致错误可能导致此函数引发异常(符合os.path.isdir()行为)。
- class
pkgutil.ImpImporter(dirname=None) -
PEP 302 包含Python“经典”导入算法的Finder .
如果dirname是一个字符串,PEP 302 创建了查找该目录的finder。如果dirname是
None, 一个 PEP 302 创建查找器来搜索当前的sys.path,加上任何冷冻或建造的模块 – 在注意
ImpImporter目前不支持在sys.meta_path.
pkgutil.find_loader(fullname)-
这是一个围绕
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)-
拿一个装载机对象module_or_name.
如果可以通过常规导入机制访问模块或包,则返回该机器相关部分周围的包装器。返回
None如果无法找到或导入模块。如果指定的模块尚未导入,则导入其包含的包(如果有),或者建立包__path__.在版本3.3中更改:更新为直接基于
importlib而不是依赖包内部PEP 302导入仿真.版本3.4更改:更新为基于PEP 451
pkgutil.iter_importers(fullname=””)-
产量查找器给定模块名称的对象.
如果fullname包含’。’,则查找器将用于包含fullname的包,否则它们将是所有已注册的顶级finfinders(即sys.meta_path和sys.path_hooks上的那些).
如果命名模块在一个包中,则该包被导入为调用该函数的副作用.
如果没有指定模块名,则生成所有顶级查找器.
在版本3.3中更改:更新为直接基于
importlib而不是依赖包内部PEP 302导入仿真.
pkgutil.iter_modules(path=None, prefix=”” )-
对于
ModuleInfo上的所有子模块,产生path,或者,如果path是None,sys.path.path上的所有顶级模块应该是
None或查找模块的路径列表。prefix是输出上每个模块名称前面输出的字符串.
注意
只适用于 finder ,它定义了
iter_modules()方法。这个界面是非标准的,所以该模块还提供了importlib.machinery.FileFinder和zipimport.zipimporter.的实现在版本3.3中更改:更新是直接基于
importlib而不是依赖包内部PEP 302导入仿真.
pkgutil.walk_packages(path=None, prefix=””, onerror=None)-
Yields
ModuleInfo对于path递归的所有模块,或者,如果path是None,所有可访问的模块path应该是
None或者是查找模块的路径列表.prefix是输出的每个模块名称前面输出的字符串.
注意这个函数必须全部导入packages(not所有模块!)在给定的path上,为了访问找到子模块的
__path__属性,onerror是一个用一个参数调用的函数(如果在尝试导入包时发生任何异常,则导入的包的名称。如果没有提供onerror功能,则
ImportError被抓住并被忽略,而所有其他异常都被传播,终止搜索.示例:
# list all modules python can accesswalk_packages()# list all submodules of ctypeswalk_packages(ctypes.__path__, ctypes.__name__ + ".")
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,然后None退回。特别是装载机对于命名空间包不支持get_data.