pkgutil —软件包扩展 Util
源代码: Lib/pkgutil.py
该模块提供了导入系统的 Util,特别是软件包支持。
-
- class *
pkgutil.
ModuleInfo
(* module_finder , name , ispkg *)
- 一个 namedtuple,其中包含模块信息的简短摘要。
- class *
3.6 版的新Function。
pkgutil.
extend_path
(* path , name *)- 扩展组成包的模块的搜索路径。预期用途是将以下代码放置在包的
__init__.py
中:
- 扩展组成包的模块的搜索路径。预期用途是将以下代码放置在包的
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
这会将sys.path
上以该软件包命名的目录的所有子目录添加到该软件包的__path__
中。如果希望将单个逻辑包的不同部分作为多个目录分发,这将很有用。
它还会从*
与* name *参数匹配的地方开始查找*.pkg
个文件。此Function类似于*.pth
文件(有关更多信息,请参见site模块),不同之处在于它不是以import
开头的特殊情况。一个*.pkg
文件是可信任的,其面值是:除了检查重复项之外,在*.pkg
文件中找到的所有条目都添加到该路径中,而不管它们是否存在于文件系统上。 (这是一个Function.)
如果 Importing 路径不是列表(冻结软件包就是这种情况),则将其保持不变。Importing 路径未修改;返回扩展副本。项目仅在末尾附加到副本中。
假定sys.path是一个序列。不是字符串的sys.path项引用现有目录。 sys.path上的 Unicode 项在用作文件名时会导致错误,可能会导致此函数引发异常(与os.path.isdir()行为一致)。
-
- class *
pkgutil.
ImpImporter
(* dirname = None *)
- PEP 302 Finder,它包装了 Python 的“经典”导入算法。
- class *
如果* dirname 是字符串,那么将创建一个 PEP 302查找器来搜索该目录。如果 dirname *是None
,则将创建一个 PEP 302查找程序,该查找程序搜索当前sys.path以及任何冻结或内置的模块。
请注意,ImpImporter目前不支持被sys.meta_path上的展示位置使用。
从版本 3.3 开始不推荐使用:不再需要此仿真,因为标准导入机制现在完全 PEP 302兼容,并且在importlib中可用。
-
- class *
pkgutil.
ImpLoader
(* fullname , file , filename , etc *)
- Loader包装了 Python 的“经典”导入算法。
- class *
从版本 3.3 开始不推荐使用:不再需要此仿真,因为标准导入机制现在完全 PEP 302兼容,并且在importlib中可用。
pkgutil.
find_loader
(全名)- 检索给定* fullname *的模块loader。
这是围绕importlib.util.find_spec()的向后兼容性包装程序,该包装程序将大多数故障转换为ImportError,并且仅返回加载程序,而不返回完整的ModuleSpec
。
在版本 3.3 中进行了更改:已更新为直接基于importlib,而不是依赖于程序包内部的 PEP 302导入仿真。
在版本 3.4 中进行了更改:已更新为基于 PEP 451
pkgutil.
get_importer
(* path_item *)- 为给定的* path_item *检索finder。
如果返回的查找程序是由路径钩子新创建的,则将其缓存在sys.path_importer_cache中。
如果需要重新扫描sys.path_hooks,则可以手动清除缓存(或缓存的一部分)。
在版本 3.3 中进行了更改:已更新为直接基于importlib,而不是依赖于程序包内部的 PEP 302导入仿真。
pkgutil.
get_loader
(* module_or_name *)- 为* module_or_name *获取一个loader对象。
如果可以pass常规导入机制访问模块或包,则返回包装该机械相关部分的 Wrapper。如果找不到或导入模块,则返回None
。如果尚未导入指定模块,则将导入其包含的包(如果有),以构建包__path__
。
在版本 3.3 中进行了更改:已更新为直接基于importlib,而不是依赖于程序包内部的 PEP 302导入仿真。
在版本 3.4 中进行了更改:已更新为基于 PEP 451
pkgutil.
iter_importers
(* fullname =“''*)- 给定模块名称产生finder个对象。
如果全名包含“。”,则查找器将用于包含全名的程序包,否则它们将是所有已注册的顶级查找器(即 sys.meta_path 和 sys.path_hooks 上的顶级查找器)。
如果指定的模块在软件包中,则导入该软件包是调用此Function的副作用。
如果未指定模块名称,则将生成所有顶级查找器。
在版本 3.3 中进行了更改:已更新为直接基于importlib,而不是依赖于程序包内部的 PEP 302导入仿真。
pkgutil.
iter_modules
(* path = None , prefix =''*)- 为* path 上的所有子模块产生ModuleInfo,如果 path *为
None
,则为sys.path
的所有顶级模块产生ModuleInfo。
- 为* path 上的所有子模块产生ModuleInfo,如果 path *为
-
path *应该为
None
或要在其中查找模块的路径列表。 -
prefix *是要在输出的每个模块名称前面输出的字符串。
Note
仅适用于定义iter_modules()
方法的finder。该接口是非标准的,因此该模块还提供importlib.machinery.FileFinder和zipimport.zipimporter的实现。
在版本 3.3 中进行了更改:已更新为直接基于importlib,而不是依赖于程序包内部的 PEP 302导入仿真。
pkgutil.
walk_packages
(* path = None , prefix ='', onerror = None *)- 以递归方式在* path 上为所有模块生成ModuleInfo,或者,如果 path *为
None
,则所有可访问模块的生成。
- 以递归方式在* path 上为所有模块生成ModuleInfo,或者,如果 path *为
-
path *应该为
None
或要在其中查找模块的路径列表。 -
prefix *是要在输出的每个模块名称前面输出的字符串。
请注意,此函数必须导入给定* path 上的所有 packages *(不是所有模块!),以便访问__path__
属性以查找子模块。
- onerror 是一个函数,如果在try导入软件包时发生任何异常,则使用一个参数(正在导入的软件包的名称)调用该函数。如果没有提供 onerror *Function,则捕获并忽略ImportError,同时传播所有其他异常,从而终止搜索。
Examples:
# list all modules python can access
walk_packages()
# list all submodules of ctypes
walk_packages(ctypes.__path__, ctypes.__name__ + '.')
Note
仅适用于定义iter_modules()
方法的finder。该接口是非标准的,因此该模块还提供importlib.machinery.FileFinder和zipimport.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的loader,则返回None
。特别是_4 的loader不支持get_data。