importlib模块

可以将字符串进行拆分

重点掌握

import importlib

mod = importlib.import_module('notify.email' )

这个时候就是将notify.email 拆分成 from notify import email

mod这个时候就等于email

它可以点email内部的所有方法

一般的使用

cls=attr(mod,'Email')

从mod模块内部获取Email类

这个时候cls就是Eail类

然后可以初始化

obj=cls()获取对象

用对象点取类中的方法等。

模块简介

Python提供了importlib包作为标准库的一部分。目的就是提供Python中import语句的实现(以及__import__函数)。另外,importlib允许程序员创建他们自定义的对象,可用于引入过程(也称为importer)。

什么是imp?

另外有一个叫做imp的模块,它提供给Python import语句机制的接口。这个模块在Python 3.4中被否决,目的就是为了只使用importlib。

这个模块有些复杂,因此我们在这篇博文中主要讨论以下几个主题:

•动态引入

•检查模块是否可以被引入

•引入源文件自身

•第三方模块 import_from_github_com

模块使用

2.1 动态引入

importlib模块支持传入字符串来引入一个模块。我们创建两个简单的模块来验证这个功能。我们将会给予两个模块相同的接口,让它们打印名字以便我们能够区分它们。创建两个模块,分别为foo.py和bar.py,代码如下所示,

def main():

print(__name__)

现在我们使用importlib来引入它们。让我们看看这段代码如何去做的。确保你已经把这段代码放在与上面创建的两个模块相同的目录下。

#importer.py

import importlib

def dynamic_import(module):

return importlib.import_module(module)

if __name__ == "__main__":

module = dynamic_import('foo')

module.main()

module_two = dynamic_import('bar')

module_two()

在这段代码中,我们手动引入importlib模块,并创建一个简单的函数dynamic_import。这个函数所做的就是调用importlib模块中的import_module函数,入参就是我们传入的字符串,然后返回调用结果。在代码段的下面,我们调用每个模块的main方法,将会打印出每个模块的名称。

在你的代码中,你可能不会大量这样做。当你只有一个字符串时,如果你想引入这个模块,importlib就允许你可以这么做。

模块引入检查

Python有一个编码规范就是EAPP:Easier to ask for forgiveness than permision。意思就是经常假设一些事情是存在的(例如,key在词典中),如果出错了,那么就捕获异常。你可以看 Python标准模块--import 文章中我们尝试引入模块,当它不存在时,我们就会捕获到ImportError。如果我们想检查并观察一个模块是否可以引入而不是仅仅是猜测,该如何去做?你可以使用importlib。代码如下:

#coding:utf-8

import importlib.util

import importlib

def check_module(module_name):

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):

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,我们的代码将会打印出这个模块没有找到。如果找到了,我们就会返回模块的说明。

我们可以获取到模块的说明,然后使用它来真正的引入模块。或者你可以将字符串传入到import_module函数中,正如我们在2.1节中所学习到的一样。但是我们已经学习到如何使用模块的说明。让我们看一下上述代码中的import_module_from_spec函数。它接受由check_module函数返回的模块说明。我们将其传入到module_from_spec函数,它将会返回引入的模块。Python的官方文档推荐,在引入模块后执行它,所以我们下一步做的就是调用exec_module函数。最后我们返回这个模块,并且运行Python的dir函数来确认这个我们就是我们所期望的。

从源文件中引入

在这一节中,我想说明importlib的子模块util还有另外一个技巧。你可以使用util通过模块名和文件路径来引入一个模块。示例如下所示,

#coding:utf-8

import importlib.util

def 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函数。在这个函数中,我们首先获取到模块的实际路径和名称。然后我们将这些信息传入到util的spec_from_file_location函数中,这个将会返回模块的说明。一旦我们获取到模块的说明,我们就可以使用与2.2节相同的importlib机制来实际引入模块。

现在让我们来看一个精巧的第三方库,Python的__import__()函数直接引入github中的包。

import_from_github_com

这个精巧的包叫做import_from_github_com,它可以用于发现和下载github上的包。为了安装他,你需要做的就是按照如下命令使用pip,

pip install import_from_github_com

这个包使用了PEP 302中新的引入钩子,允许你可以从github上引入包。这个包实际做的就是安装这个包并将它添加到本地。你需要Python 3.2或者更高的版本,git和pip才能使用这个包。

一旦这些已经安装,你可以在Python shell中输入如下命令,

>>> from github_com.zzzeek import sqlalchemy

Collecting git+https://github.com/zzzeek/sqlalchemy

Cloning https://github.com/zzzeek/sqlalchemy to /tmp/pip-acfv7t06-build

Installing collected packages: SQLAlchemy

Running setup.py install for SQLAlchemy ... done

Successfully installed SQLAlchemy-1.1.0b1.dev0

>>> locals()

{'__builtins__': , '__spec__': None,

'__package__': None, '__doc__': None, '__name__': '__main__',

'sqlalchemy':

sqlalchemy/__init__.py'>,

'__loader__': }

你如果看了import_from_github_com的源码,你将会注意到它并没有使用importlib。实际上,它使用了pip来安装那些没有安装的包,然后使用Python的__import__()函数来引入新安装的模块。这段代码非常值得学习。

总结

到这里,你已经了解到在你的代码中如何使用importlib和引入钩子。当然还有很多超出本文所覆盖的知识,如果你需要写一个自定义的引入器或者下载器,你需要花费很多时间来阅读官方文档和源码。

python中importlib模块安装_importlib模块相关推荐

  1. Python中常用的数据分析工具(模块)有哪些?

    本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...

  2. Python中计算程序的运行时间——timeit模块

    Python中计算程序的运行时间--timeit模块 绪论 一.timeit的基本用法 1.1 timeit.timeit()函数: 创建一个Timer实例,并运行代码进行计时,默认将代码执行一百万次 ...

  3. #21天学习挑战赛#Python入门之mac安装第三方模块——详细教程

    开卷有益!对于python小白而言,学习每前进一步都会遇到门槛.尽管带队老师在紧锣密鼓地往前开通学习资料权限,可是python小白还在后面蜗牛般爬行,这不,在mac终端安装第三方模块就成了一道拦路门槛 ...

  4. python中pandas安装视频教程_详解Python中pandas的安装操作说明(傻瓜版)

    很多人来问我pandas的安装(python数据分析里面的必修课) 步骤如下: 安装python的时候,把路径加到系统里,这样,随时可以用pip 路径添加方法: 查找路径: 路径1: 2.例如: 即: ...

  5. python中通过pip安装套件

    python中通过pip安装套件 听语音 | 浏览:507 | 更新:2017-03-23 05:23 1 2 3 4 5 6 7 分步阅读 python程序在某种程度上可以说是无所不能,通过它的pi ...

  6. python中使用pip安装报错:Fatal error in launcher... 解决方法

    python中使用pip安装报错:Fatal error in launcher... 解决方法 参考文章: (1)python中使用pip安装报错:Fatal error in launcher.. ...

  7. Python中当pip安装不成功的解决办法

    Python中当pip安装不成功的解决办法 pip是Windows安装三方库最简单的方式,但是有的时候可能会不成功,以下是我个人的解决办法. 1.由于网络原因,外网的下载速度较慢,一直没进展,这种情况 ...

  8. 关于python 中h5py库安装不上的解决办法

    关于python 中h5py库安装不上的解决办法 问题 解决步骤 1.先安装wheel这个库,方法就是从命令行中输入pip install wheel 2.下载自己对应的h5py的版本,网址如下 3. ...

  9. python中importlib模块安装_Python中标准模块importlib详解

    Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外 ...

最新文章

  1. setleft android,android TextView的setCompoundDrawables()方法
  2. 打基础和俄罗斯方块的关系
  3. Linux重定向指令
  4. java递归api_javaAPI_IO流基础_递归使用
  5. oracle突然挂了服务全部消失,OracleService服务不见了|OracleServiceXE服务没有了
  6. 2017-5-5/PHP实现负载均衡的加权轮询
  7. MySql学习之组合查询
  8. 包含min函数的栈 【微软面试100题 第二题】
  9. PDF如何添加下划线 捷速PDF编辑器一键搞定
  10. 安卓眼球追踪_研究者开发AI眼球追踪系统 智能手机都能用
  11. java+rabbitMQ实现一对一聊天
  12. 台式计算机怎么查是32位还是64位,Win7系统怎么看电脑是32位还是64位?
  13. 淘特(淘宝特价版)关键词搜索
  14. 计算机桌面有什么,电脑桌面是什么
  15. Mac OS 下使用 afconvert 命令,处理音频格式转换
  16. 服务器遇到大流量攻击的处理过程
  17. Esrally性能测试步骤与调优
  18. 闽南师范大学计算机系实力,这5所地方师范大学实力挺强,在本地很受认可,性价比高...
  19. 报错解决:Before you can run VMware, several modules must be compiled ...
  20. android linux终端,为Android安装Linux终端仿真与环境APP

热门文章

  1. 多视图关联选择的例子
  2. 使用IB_DESIGNABLE与IBInspectable特性实现可在视图编辑器的功能栏中设置
  3. exe程序获得外部传入命令行方法
  4. 99.两个时钟不同步的设备怎么通信?
  5. Linux后台进程管理以及ctrl+z(挂起)、ctrl+c(中断)、ctrl+\(退出)和ctrl+d(EOF)的区别
  6. USB启动盘制作的几种方式
  7. (一)为什么你应该(从现在开始就)写博客
  8. 清华计算机知识工程怎么样,张民(muslv)清华大学计算机系知识工程组 硕士清华大学.ppt...
  9. java 内存泄漏场景_Java内存泄露的例子
  10. html iframe.b.gen 病毒,常见病毒及处理方法.doc