pkgutil

2.3版本的新功能。

源代码: Lib / pkgutil.py

该模块为导入系统提供实用程序,特别是软件包支持。

pkgutil.extend_path(path, name)

扩展组成包的模块的搜索路径。预期用途是将以下代码放入包中__init__.py

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

这将添加到软件包的__path__所有以该软件包sys.path命名的目录的子目录上。如果要将单个逻辑包的不同部分分配为多个目录,这非常有用。

它还会查找与名称参数匹配的*.pkg文件。该功能与文件类似(请参阅模块以获取更多信息),不同之处在于它不包含以特殊字符开头的行。一个文件在面值上是可信的:除了检查重复项之外,文件中找到的所有项都被添加到路径中,而不管它们是否存在于文件系统中。(这是一个功能。)**.pthsiteimport*.pkg*.pkg

如果输入路径不是列表(如冻结包的情况那样),它将保持不变。输入路径未被修改; 将返回一个扩展副本。项目只在最后附加到副本。

假定sys.path是一个序列。的项目sys.path不属于(Unicode或8位),参照现有的目录被忽略的字符串。sys.path当用作文件名时导致错误的Unicode项可能会导致此函数引发异常(符合os.path.isdir()行为)。

class pkgutil.ImpImporter(dirname=None)

PEP 302导入器,它包装了Python的“经典”导入算法。

如果dirname是一个字符串,则会创建一个PEP 302导入器来搜索该目录。如果dirnameNone,则会创建一个PEP 302导入器,用于搜索当前sys.path以及任何冻结或内置的模块。

请注意,ImpImporter目前不支持在展示位置上使用sys.meta_path

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

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

pkgutil.find_loader(fullname)

查找PEP 302 “装载”为对象的全名

如果fullname包含点,则路径必须是包含的包__path__None如果无法找到或导入模块,则返回。此功能使用iter_importers(),因此受到与特定于平台的特殊导入位置(如Windows注册表)相同的限制。

pkgutil.get_importer(path_item)

检索给定path_itemPEP 302导入

sys.path_importer_cache如果它是由路径钩子新创建的,则返回的导入器将被缓存。

如果没有进口商,则返回基本进口机械的包装。这个包装永远不会插入到导入器缓存中(None而是插入)。

如果需要重新扫描,sys.path_hooks则可以手动清除缓存(或部分缓存)。

pkgutil.get_loader(module_or_name)

module_or_name获取一个PEP 302 “加载器”对象。

如果模块或包装可以通过正常的进口机制进行访问,则返回该机械相关部件周围的包装。None如果无法找到或导入模块,则返回。如果已命名的模块尚未导入,则会导入其包含的包(如果有),以便建立包__path__

此功能使用iter_importers(),因此受到与特定于平台的特殊导入位置(如Windows注册表)相同的限制。

pkgutil.iter_importers(fullname='')

产量PEP 302个进口商为给定的模块名称。

如果全名中含有“”,进口商将包含全名包,否则会为进口商sys.meta_pathsys.path和Python的‘经典’的进口机器,按照这个顺序。如果指定的模块位于包中,则该包将作为调用此函数的副作用导入。

部分支持标准导入机制用于在其他位置查找文件的非PEP 302机制(例如Windows注册表),但会在后面 进行搜索sys.path。通常情况下,这些位置在之前 被搜索sys.path,以防止sys.path对它们进行投影。

为了在行为上产生明显的差异,必须有一个模块或软件包名称可以通过这两种sys.pathPEP 302文件系统机制之一访问。在这种情况下,仿真会找到前一个版本,而内置的导入机制会找到后者。

:以下类型的项目可以通过这种差异的影响imp.C_EXTENSIONimp.PY_SOURCEimp.PY_COMPILEDimp.PKG_DIRECTORY

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

路径(module_loader, name, ispkg)上的所有子模块的产量,或者,如果路径是,所有顶级模块都打开。Nonesys.path

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

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

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

(module_loader, name, ispkg)所有模块在路径上递归产生,或者如果路径是None所有可访问的模块。

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

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

请注意,此函数必须导入给定路径上的所有不是所有模块!),以便访问该属性以查找子模块。__path__

onerror是一个函数,如果在尝试导入程序包时发生任何异常,则会使用一个参数(正在导入的程序包的名称)调用它。如果未提供onerror函数,ImportError则会捕获并忽略这些函数,而传播所有其他异常,从而终止搜索。

例子:

# list all modules python can access
walk_packages()

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

pkgutil.get_data(package, resource)

从包中获取资源。

这是PEP 302加载器get_data()API 的包装。所述参数应该是一个包的名称,在标准模块格式(foo.bar)。所述资源参数应该是在一个相对文件名的形式,使用/作为路径分隔。父目录名称..是不允许的,也不是根目录名称(以a开头/)。

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

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

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

如果包装不能被找到或装载,或者它使用不支持的PEP 302装载机get_data(),则None返回。

2.6版本中的新功能。

扫码关注云+社区

领取腾讯云代金券