首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python:import 与__imp

Python:import 与__imp

作者头像
py3study
发布2020-01-19 11:12:16
发布2020-01-19 11:12:16
1.5K0
举报
文章被收录于专栏:python3python3

首先来说一下两者的区别:

  import指令做了两件事:1)搜索module,2)绑定到局部变量   内置函数__import__()只做了一件事:搜索module

  import指令执行过程中是调用__import__()来完成Module检索的。

搜索module的过程:

在了解搜索的过程前,先来了解一下内部实现中的几个角色:          a)已经搜索过的module会存在于一个module缓存(sys.modules)中。          b)finders | importers: 用于搜索module在哪里,找到后返回的是module-spec (包含Module在哪里,该用那个loader进行加载等信息)。                     其中finders是从build-in 模块中找,importers是从其他位置找。                     importers是可扩展的,可以支持文件系统某个路径、zip、urls。          c)loaders: 依据modulespec 进行加载,生成python中的module                     module = modulespec.loader.load_module(modulespec.name)

搜索过程如下:

1)如果要搜索的module 的name 在缓存(sys.modules )中,则进行如下操作:       1.1)如果值是None,抛出 ModuleNotFoundError       1.2)值不是None,直接返回值 2)由finders从内置模块里找,找不到由importer去找,importers也找不到,module的name到缓存,值为None,然后raise ModuleNotFoundError。              在使用importers去找的时候,如果发现了有.pyc,需要先检查.pyc是否最新。              找到后,返回 生成创建一个module-spec 3)由module-spec中的loader去加载并执行module:              module = modulespec.loader.load_module(modulespec.name)              sys.modules[modulespec.name] = module              modulespec.loader.exec_module(module) 4)最终没有找到,记录module的name到缓存,值为None,然后 raise ModuleNotFoundError

想要了解更多,可以参考 https://docs.python.org/3/reference/import.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档