You are here:  Home » Python » – 包扩展实用程序 – 导入模块(Python教程)(参考资料)

pkgutil– 包扩展实用程序

源代码: Lib / pkgutil.py


模块导入系统提供实用程序,特别是packagesupport .

class pkgutil.ModuleInfomodule_finder, name, ispkg

一个命名元组,它包含一个模块信息的简短摘要.

新版本3.6.

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的项目不是指向现有目录的字符串,将被忽略。//上的Unicodeitems sys.path当用作文件名时导致错误可能导致此函数引发异常(符合os.path.isdir()行为)。

class pkgutil.ImpImporterdirname=None

PEP 302 包含Python“经典”导入算法的Finder .

如果dirname是一个字符串,PEP 302 创建了查找该目录的finder。如果dirnameNone, 一个 PEP 302 创建查找器来搜索当前的sys.path,加上任何冷冻或建造的模块 – 在

注意 ImpImporter目前不支持在sys.meta_path.

从版本3.3开始不推荐使用:不再需要这种仿真,因为标准导入机制现在完全符合PEP 302并且可用于importlib.

class pkgutil.ImpLoaderfullname, file, filename, etc

装载机包装了Python的“经典”导入算法.

自版本3.3以后删除了不再需要这种仿真,因为标准导入机制现在完全符合PEP 302并且可用于importlib.

pkgutil.find_loaderfullname

检索模块加载器对于给定的 fullname.

这是一个围绕importlib.util.find_spec()的向后兼容包装器,它将大多数故障转换为ImportError并且只返回加载器而不是完整的ModuleSpec.

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

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

pkgutil.get_importerpath_item

检索 finder 对于给定的path_item.

返回的查找器缓存在sys.path_importer_cache中,如果它是由路径钩子新创建的

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

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

pkgutil.get_loadermodule_or_name

拿一个装载机对象module_or_name.

如果可以通过常规导入机制访问模块或包,则返回该机器相关部分周围的包装器。返回None如果无法找到或导入模块。如果指定的模块尚未导入,则导入其包含的包(如果有),或者建立包__path__.

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

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

pkgutil.iter_importersfullname=””

产量查找器给定模块名称的对象.

如果fullname包含’。’,则查找器将用于包含fullname的包,否则它们将是所有已注册的顶级finfinders(即sys.meta_path和sys.path_hooks上的那些).

如果命名模块在一个包中,则该包被导入为调用该函数的副作用.

如果没有指定模块名,则生成所有顶级查找器.

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

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

对于ModuleInfo上的所有子模块,产生path,或者,如果pathNonesys.path.

path上的所有顶级模块应该是None或查找模块的路径列表。

prefix是输出上每个模块名称前面输出的字符串.

注意

只适用于 finder ,它定义了iter_modules()方法。这个界面是非标准的,所以该模块还提供了importlib.machinery.FileFinderzipimport.zipimporter.

的实现在版本3.3中更改:更新是直接基于importlib而不是依赖包内部PEP 302导入仿真.

pkgutil.walk_packages (path=None, prefix=””, onerror=None

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

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

prefix是输出的每个模块名称前面输出的字符串.

注意这个函数必须全部导入packagesnot所有模块!)在给定的path上,为了访问找到子模块的__path__属性,

onerror是一个用一个参数调用的函数(如果在尝试导入包时发生任何异常,则导入的包的名称。如果没有提供onerror功能,则ImportError被抓住并被忽略,而所有其他异常都被传播,终止搜索.

示例:

# list all modules python can accesswalk_packages()# list all submodules of ctypeswalk_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 API的包装器。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.