Python中的包扩展实用程序

当您想为特定软件包添加模块搜索路径并使用软件包中包含的资源时,您需要使用Python库中的pkgutil模块。它包含用于更改Python软件包的导入规则的功能。也可以从分布在软件包中的文件中加载非代码资源。

extend_path(路径,名称)

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

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

extend_path()扫描sys.path中的目录,这些目录包括为第二个参数指定的包命名的子目录。目录列表与作为第一个参数传递的路径值组合在一起,并作为单个列表返回,适合用作包导入路径。

find_loader(fullname):检索给定全名的模块加载器。

get_importer(path_item):检索给定path_item的查找器。

get_loader(模块名称)

获取module_or_name的加载程序对象。

iter_importers(fullname =''):给定模块名称的产量查找器对象。

iter_modules(path = None,prefix =''):产生path上所有子模块的ModuleInfo,如果path为None,则产生sys.path上所有顶级模块的ModuleInfo。

>>> pk = pkgutil.iter_modules()
>>> for p in pk:
   print (p[1])

walk_packages(path = None,prefix ='',onerror = None):递归生成路径上所有模块的ModuleInfo,或者,如果path为None,则产生所有可访问模块。

import pkgutil
import sys
def explore_package(module_name):
   loader = pkgutil.get_loader(module_name)
   for sub_module in pkgutil.walk_packages([loader.filename]):
      _, sub_module_name, _ = sub_module
      qname = module_name + "." + sub_module_name
      print(qname)
      explore_package(qname)

ModuleInfo(module_finder,name,ispkg):这将返回一个namedtuple,其中包含模块信息的简短摘要。