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

  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

Python:import 与__import__()的更多相关文章

  1. import,reload,__import__在python中的区别

    import,reload,__import__在python中的区别 http://blog.csdn.net/five3/article/details/7762870 import作用:导入/引 ...

  2. python import, from xx import yy

    区别: 用import modulexx/packagexx.moduleyy是导入某一模块,如果想引用模块的内容(class, method,variables...)必须用全名,即 [module ...

  3. python import eventlet包时提示ImportError: cannot import name eventlet

    root@zte-desktop:/home/ubuntu/python-threads# cat eventlet.py #!/usr/bin python import eventlet from ...

  4. python import 模块异常问题

    新项目开始了,(tornado,python) 结果出现了一个比较诡异的问题. import 自己的在conf文件夹下配置文件settings的时候, from conf.settings impor ...

  5. Python import / pyd / dll

    使用Python import 模块时, 先会在模块的搜索path里依次搜索(前面会覆盖之后出现的同名模块),次序为: 1. 程序的主目录(交互模式下当前的工作目录或 脚本文件所在的目录) 2. 环境 ...

  6. 【转】python import的用法

    [转自http://blog.sina.com.cn/s/blog_4b5039210100ennq.html] 在python用import或者from...import来导入相应的模块.模块其实就 ...

  7. python import media模块

    安装PyGraphics包 (python import media模块)有一段代码要import media,打开python自带的IDLE,输入: >>>import media ...

  8. Python: import vs from (module) import function(class) 的理解

    Python: Import vs From (module) import function(class) 本文涉及的 Python 基本概念: Module Class import from . ...

  9. python import自定义模块方法

    转自:http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html python包含子目录中的模块方法比较简单,关键是能够在sys.pat ...

  10. python import自己编写的模块:import json和simplejson

    python import的模块都是库里面的,而自己的模块也可以添加 比如python的json处理,库里没有json文件,import json不行. 网上大部分人告诉你处理json用 dumps和 ...

随机推荐

  1. js如何获取url参数

    匹配URL参数的正则是: var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", ...

  2. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer

    Advanced Installer :Free for 30 days. All features. 下载地址:https://www.advancedinstaller.com/download. ...

  3. 【转载】网站遭遇DDoS攻击怎么办

    在网站运维过程中,有些人的网站遭遇过DDoS攻击,DDos攻击又叫做分布式拒绝服务攻击.DDos攻击将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力 ...

  4. webapi 控制json的字段(key)显示顺序

    使用两个c#的特性: 加在类上的:[DataContract] 加在字段上的:[DataMember(Name = "ResultCode",EmitDefaultValue = ...

  5. Jquery ajax, Axios, Fetch区别之我见(转载)

    来源:https://segmentfault.com/a/1190000012836882 引言 前端技术真是一个发展飞快的领域,我三年前入职的时候只有原生XHR和Jquery ajax,我们还曾被 ...

  6. 买or不买?如何测试博彩公司赔率是否合理?

    世界杯期间,烧烤店.酒吧都热闹起来了,柔柔我的朋友圈也热闹起来了,有酱紫的: 还有酱紫的: 然后还有酱紫的: 酱紫的: 当然天台也是一如既然的热闹: 似乎人人都在输钱,那真正的赢家在哪里呢?博彩业的真 ...

  7. QueryRunner使用之可变条件的处理

    在三层架构的Dao层中,需要通过不确定的条件,从数据库查询结果. 可以利用List集合作为容器将条件存储起来. 实际开发中的代码: public List<Hotel> searchByF ...

  8. Java基础IO流(四)序列化与反序列化

    对象的序列化与反序列化: 对象的序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 序列化流(ObjectOutInputStream),是过滤流 -------writeObjec ...

  9. Python3 系列之 面向对象篇

    面向对象的三大特性:继承.封装和多态 Python 做到胶水语言,当然也支持面向对象的编程模式. 封装 class UserInfo(object): lv = 5 def __init__(self ...

  10. MR程序本地调试,提交到集群运行

    在本地调试,提交到集群上运行. 在本地程序中的Configuration中添加如下配置: Configuration conf = new Configuration(); conf.set(&quo ...