pkgutil
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
导入器来搜索该目录。如果dirname
是None
,则会创建一个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_item
的PEP 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_path
,sys.path
和Python的‘经典’的进口机器,按照这个顺序。如果指定的模块位于包中,则该包将作为调用此函数的副作用导入。
部分支持标准导入机制用于在其他位置查找文件的非PEP 302
机制(例如Windows注册表),但会在后面
进行搜索sys.path
。通常情况下,这些位置在之前
被搜索到
sys.path
,以防止sys.path
对它们进行投影。
为了在行为上产生明显的差异,必须有一个模块或软件包名称可以通过这两种sys.path
非PEP 302
文件系统机制之一访问。在这种情况下,仿真会找到前一个版本,而内置的导入机制会找到后者。
:以下类型的项目可以通过这种差异的影响imp.C_EXTENSION
,imp.PY_SOURCE
,imp.PY_COMPILED
,imp.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版本中的新功能。