– 包扩展实用程序 – 导入模块(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_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
.