Python将importlib作为标准库提供。它旨在提供Pythonimport语法和(__import__()函数)的实现。另外,importlib提供了开发者可以创建自己的对象(即importer)来处理导入过程。

那么imp呢?还有一个imp模块提供了import语句接口,不过这个模块在Python3.4已经deprecated了。建议使用importlib来处理。

这个模块比较复杂,文中我们主要探讨如下主题:

  • 动态导入
  • 检查模块是否可以导入
  • 从源文件导入

我们先从动态导入开始。

动态导入

importlib模块支持传递字符串来导入模块。我们先来创建一些简单模块一遍演示。我们在模块里提供了相同接口,通过打印它们自身名字来区分。我们分别创建了foo.pybar.py,代码如下:

def main():print(__name__)

现在我们尽需要使用importlib导入它们。我们来看看代码是如何实现的,确保该代码在刚才创建的两个文件的相同目录下。

#importer
import importlibdef dynamic_import(module): return importlib.import_module(module) if __name__ == "__main__": module = dynamic_import('foo') module.main() module2 = dynamic_import('bar') module2.main() 

这里我们导入importlib模块,并创建了一个非常简单的函数dynamic_import。这个函数直接就调用了importlib的import_module方法,并将要导入的模块字符串传递作为参数,最后返回其结果。然后在主入口中我们分别调用了各自的main方法,将打印出各自的name.

$ python3 importer.py
foo
bar

也许你很少会代码这么做,不过在你需要试用字符串作为导入路径的话,那么importlib就有用途了。

模块导入检查

Python有个众所周知的代码风格EAFP: Easier to ask forgiveness than permission.它所代表的意思就是总是先确保事物存在(例如字典中的键)以及在犯错时捕获。如果我们在导入前想检查是否这个模块存在而不是靠猜。 使用mportlib就能实现。

import importlib.utildef check_module(module_name): """  Checks if module can be imported without actually  importing it  """ module_spec = importlib.util.find_spec(module_name) if module_spec is None: print("Module: {} not found".format(module_name)) return None else: print("Module: {} can be imported".format(module_name)) return module_spec def import_module_from_spec(module_spec): """  Import the module via the passed in module specification  Returns the newly imported module  """ module = importlib.util.module_from_spec(module_spec) module_spec.loader.exec_module(module) return module if __name__ == '__main__': module_spec = check_module('fake_module') module_spec = check_module('collections') if module_spec: module = import_module_from_spec(module_spec) print(dir(module)) 

这里我导入了importlib的子模块util。check_module里面调用find_spec方法, 传递该模块字符串作为参数。当我们分别传入了一个不存在和存在的Python模块。你可以看到当你传入不存在的模块时,find_spec函数将返回 None,在我们代码里就会打印提示。如果存在我们将返回模块的specification。

我们可以通过该模块的specification来实际导入该模块。或者你直接将字符串作为参数调用import_module函数。不过我这里也学习如何试用模块specification方式导入。看看import_module_from_spec函数。它接受check_module提供的模块specification作为参数。然后我们将它传递给了module_from_spec函数,它将返回导入模块。Python文档推荐导入后然后执行模块,所以接下来我们试用exec_module函数执行。最后我们使用dir来确保得到预期模块。

从源代码导入

importlib的子模块有个很好用的技巧我想提提。你可以使用util通过模块的名字和路径来导入模块。

import importlib.utildef import_source(module_name): module_file_path = module_name.__file__ module_name = module_name.__name__ module_spec = importlib.util.spec_from_file_location( module_name, module_file_path ) module = importlib.util.module_from_spec(module_spec) module_spec.loader.exec_module(module) print(dir((module))) msg = 'The {module_name} module has the following methods {methods}' print(msg.format(module_name=module_name, methods=dir(module))) if __name__ == "__main__": import logging import_source(logging) 

在上面的代码中,我们实际导入logging模块,并将模块传递给了import_source函数。这样我们就可以通过导入的模块获取到实际的路 径和名字。然后我们将信息传递给sec_from_file_location函数,它将返回模块的specification。也了这个我们就可以在前 面那样直接通过importlib导入了。

总结

目前,你知道如何在代码中使用importlib和import钩子。这个模块内容非常多,如果你想自定义importer或者loader,那么你可以通过官方文档或者源代码了解更多。

转载于:https://www.cnblogs.com/journey-mk5/p/10078712.html

介绍importlib相关推荐

  1. python导入机制及importlib模块

    文章目录 写在篇前 import 关键字 先导概念 namespace & scope Module & Packages module packages regular packag ...

  2. python 标准库之 glob 介绍(获取文件夹下所有同类文件)

    python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...

  3. python动态导入模块_Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析...

    本文实例讲述了Python动态导入模块:__import__.importlib.动态导入的使用场景.分享给大家供大家参考,具体如下: 相关内容: __import__ importlib 动态导入的 ...

  4. python解释器cpython的源码简要介绍

    0. 参考文档 参考文档如下: Your Guide to the CPython Source Code [python]带你入门cpython源代码,让你不再一头雾水!尝试去读读python的实现 ...

  5. Python:Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3))、安装、学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略

    Python:Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3)).安装.学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略 ...

  6. python之getattr()函数和importlib库的使用

    1.getattr()介绍 2.如果对象obj是类对象 3.如果对象obj是模块对象 4.如果查看对象obj的属性? 5.总结 6.importlib的使用 之所以使用到getattr()函数,因为我 ...

  7. 第3章 你应该如何运行程序 (可选,Shell、IDE介绍,推荐看一下)

    本章会有一些代码示例,但是请不要追寻这些语句的意思,这只是演示交互式的一个示例,之后的章节自然会介绍到相关语句. 我们已经介绍了许多执行Python程序的方式.本章中所讨论的都是当前常用的程序启动技术 ...

  8. Cobbler自动化装机服务详细介绍

    PS:本文为新手根据网络文章梳理而成,便于自己及网友更直观理解哈,参考文章见文末链接及小注标识,侵删 目录 PXE简介 kickstart简介 Cobbler简介 功能实现 一.PXE简介 PXE,就 ...

  9. Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3))、安装、学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略

    目录 Python语言的简介 1.Python的应用领域 2.Python语言特点.对比其它语言 2.1.Python语言特点 2.2.Python语言对比其它语言 3.Python版本语言兼容问题( ...

最新文章

  1. POJ 3617 Best Cow Line 贪心算法
  2. android一体机-迅为10.1寸用于售货机、人机界面、自动终端、触摸控制
  3. pep8 python 编码规范_实用的python编码规范
  4. linux网络代码结构
  5. caffe android lib
  6. 推荐一个下载中国城市统计年鉴的地址
  7. win7安装office2016报错:无法找到入口
  8. Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析
  9. echarts地图设置边界线颜色显示不全
  10. 【重装系统】Ubuntu系统重装为windows10
  11. 嵌入式分享合集128
  12. 高通8996启动流程-3. sbl1启动流程
  13. python+selenium实现淘宝双十一自动下单
  14. 图灵机是最早的计算机,计算机发展史之图灵机
  15. 那些年啊 那些事 一个程序员的奋斗史 127
  16. FMDB 操作数据库
  17. adb发送什么命令能在手机屏幕弹窗显示_魅族手机关闭自动更新的教程
  18. 网络系统集成与综合布线复习资料
  19. Direct2D 1.1 开发笔记 特效篇(一) 使用D2D特效
  20. Linux IPC总结(全)

热门文章

  1. Android移动开发之【Android实战项目】漂亮Button样式
  2. 习题1.8 二分查找 (20 分)
  3. 2 resize 到指定大小_阿里巴巴为什么让初始化集合时必须指定大小?
  4. ideal连接数据库报错The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time
  5. 网站优化之网站文章更新需注意哪些问题?
  6. adb打开packages_adb shell pm list packages的用法
  7. linux cache lru回收,LRU cache 算法
  8. 计算机绘画教案风车,中班美术教案《风车》
  9. (整理类)文件描述符,文件描述符标志,文件状态标志
  10. 开发日记-20190725 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 15