URLhttps://learnscript.net/zh/python-reference/import-system/module-finders/
    复制链接转到说明  示例

    Python 模块查找器介绍

    我被代码海扁署名-非商业-禁演绎
    阅读 3:14·字数 970·发布 

    本节所讲述的 Python 模块查找器,同样适用于包,因为包是特殊的模块。

    Python 模块查找器

    模块查找器作为 Python 导入系统的一部份,其对应的英文为 Module Finders,他的作用是查找定位需要载入的模块。这通常发生在import语句执行时,模块查找器可能会被启动并返回相关模块的信息,以便进行下一步的载入操作,如果模块查找器未找到所需模块,那么将导致异常ModuleNotFoundError

    模块查找器何时工作?

    只有当模块缓存中没有需要载入的模块时,模块查找器才会运行并定位模块,请留意这一点,他说明模块查找器并不需要确定模块是否存在缓存,这项工作在启动查找器之前已经完成。如果你希望编写自己的模块查找器,那么不必在缓存上浪费时间。

    模块

    想要了解模块缓存,你可以查看Python 模块缓存一段。

    Python 模块查找器种类

    模块查找器可以分为元路径查找器(Meta Path Finder)和路径条目查找器(Path Entry Finder),其中路径条目查找器具体实现了基于路径定位 Python 脚本的功能,比如,定位模块Dog对应的脚本文件。

    事实上,元路径查找器和路径条目查找器均不止一个,他们被保存在两个不同的列表对象中。

    路径条目查找器隶属于元路径查找器

    需要指出,路径条目查找器只是服务于元路径查找器PathFinder,如果我们将该查找器删除,那么路径条目查找器将不会发挥作用,对应的 Python 脚本也将无法载入。

    在文件finders.py中,我们使用import语句导入了位于同一目录的apple模块。由于在此之前PathFinder元路径查找器被删除,因此导入apple将导致异常ModuleNotFoundError

    finders.py
    # 尝试找到名称包含 PathFinder 的查找器
    import sys
    path_finder = None
    
    for finder in sys.meta_path: if 'PathFinder' in str(finder): path_finder = finder break

    # 将找到的 PathFinder 查找器删除 if path_finder: sys.meta_path.remove(path_finder)
    # 导入 apple 模块 import apple
    apple.py
    print('模块 apple 被查找器发现了!')
    ModuleNotFoundError: No module named 'apple'

    Python 模块查找挂钩

    Python 的模块查找器具有可拓展性,你可以编写自己的模块查找器,来报告模块所在的位置,比如,存放在互联网或局域网的模块的地址。官方文档将其描述为挂钩,你可以理解为添加查找器实现自定义查找方式的过程,或查找器本身。

    内容分类

    源码

    finders.py·codebeatme/python-reference·GitHub
    apple.py·codebeatme/python-reference·GitHub