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

Python中标准模块importlib详解

模块简介

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

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

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

动态引入

检查模块是否可以被引入

引入源文件自身

第三方模块 import_from_github_com

模块使用

1 动态引入

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

def main():

print(__name__)12

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

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.main()1234567891011

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

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

2 模块引入检查

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

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

这里我们引入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函数来确认这个我们就是我们所期望的。

3 从源文件中引入

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

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

上述代码中,我们实际引入了logging模块,并将它传入到import_source函数。在这个函数中,我们首先获取到模块的实际路径和名称。然后我们将这些信息传入到util的spec_from_file_location函数中,这个将会返回模块的说明。一旦我们获取到模块的说明,我们就可以使用与2.2节相同的importlib机制来实际引入模块。 现在让我们来看一个精巧的第三方库,Python的__import__()函数直接引入github中的包。

4 import_from_github_com

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

pip install import_from_github_com1

这个包使用了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__': }123456789101112

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HiveQL:查询

文章目录1. select from1.1 正则表达式指定列1.2 使用列值计算1.3 使用函数1.4 limit 限制返回行数1.5 别名 as name1.6 case when then 语句2. where 语句3. JOIN 优化4. 抽样查询5. union all学自《hive编程指南》 1. select from hive (default)> create table employe…

unity鼠标控制镜头旋转_Unity Camera教程之 摄像机跟随鼠标移动而旋转

FollowMouseMove 脚本具体内容如下:using UnityEngine;public class FollowMouseMove : MonoBehaviour {public float moveSpeed 5.0f;// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){// 获得鼠标当前位置的X和Yfl…

html里span和div,HTML div和span

块代码和1...ccwTest {font-family: .PingFang SC;">;color:white;margin:18px;padding:16px;}这些是文字这里是内容,改变这些文字的颜色或者是改变其他属性需要写在style里 ccwTest是名字,相当于ios中的对象名 通过这个对象名找到是调用的哪个方法2..span.red {color:…

python闭包详解函数_详解python函数的闭包问题(内部函数与外部函数详述)

python函数的闭包问题(内嵌函数) >>> def func1(): ... print (func1 running...) ... def func2(): ... print (func2 running...) ... func2() ... >>> func1() func1 running... func2 running... 内部函数func2作用域都在外部函数…

实现一个简单的web服务器

代码:http://www.oschina.net/code/snippet_991746_45911转载于:https://www.cnblogs.com/lit10050528/p/4282771.html

python format 冒号_python之格式化输出

字符串格式化有两种方式,%和format先介绍下%号的方法#%s的语法结构,叫做占位符,就是先占一个位置,然后我们用真实的要显示的数据替换占位符即可#最简单的用法就是下面的方式,其实%s还有其他的功能# s 我的名字是%s,我…

Scala 入门1(变量、分支循环、函数)

文章目录1. var 变量,val常量2. 分支、循环3. 函数、方法4. 闭包学自 https://www.runoob.com/scala/scala-tutorial.html 1. var 变量,val常量 scala 语句 用 ; 或者 \n 分句 object HelloWorld { // 类名跟文件名一致def main(args: Array[String])…

2018qs计算机科学专业,2018QS世界大学计算机科学专业排名.docx

2018QS世界大学计算机科学专业排名在2018世界大学计算机科学与信息系统排名中,牛津大学位列第一,哈佛大学和剑桥大学紧随其后。本排名中,共有2所中国大学进入Top50,北京大学位列第17位,清华大学列 20 位,跟…

http://www.cnblogs.com/langjt/p/4281477.html

http://www.cnblogs.com/langjt/p/4281477.html转载于:https://www.cnblogs.com/outlooking/p/4283320.html

nineoldandroid使用_nineoldandroid 详细使用并且实现drawerlayout侧滑动画

nineoldandroid.view.ViewHelpe是一个为了兼容3.0以下的一个动画开源库相关函数解读:(第一个参数都为动画对象,第二个为动画属性值的变化表达式)ViewHelper.setTranslationX(,);//x方向平移ViewHelper.setTranslationY(,);ViewHelper.setScaleX(,);x方向…

maven deploy plugin_Maven快速上手

作者:u_7deeb657158f出自:ITPUB博客原文:blog.itpub.net/69956102/viewspace-2726121/创建项目首先需要创建一个用于存储项目的文件夹,在控制台中输入以下命令:mvn archetype:generate -DgroupIdcom.mycompany.app -Da…

计算机应用基础形考作业3Excel部分,计算机应用基础形考3,Excel部分

“计算机应用基础”形考作业 3(Excel部分)可根据所学知识模块,在下列Excel、PowerPoint或Access中选做一个,我选了Excel (本次作业覆盖“模块 3 Excel 2010 电子表格系统”的内容,请在学完模块3后完成本次作业,要求第17周内完成。…

.net string format

转自:http://www.cnblogs.com/jobs2/p/3948049.html 转自:http://jingyan.baidu.com/article/48206aeaf8c52f216ad6b300.html 1、格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元&#xff0…

Scala 入门2(数组、List、Set、Map、元组、Option、Iterator)

文章目录1. 数组2. List3. Set4. Map5. 元组6. Option7. 迭代器学自 https://www.runoob.com/scala/scala-tutorial.html 1. 数组 使用 () 来取索引处的元素 // 数组var z1 : Array[String] new Array[String](3)var z2 new Array[String](3) // 两种方式定义z1(0) "…

python实现非对称加密算法_Python3非对称加密算法RSA实例详解

本文实例讲述了Python3非对称加密算法RSA。分享给大家供大家参考,具体如下:python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥、私钥。其中 python3.6 Crypto 库的安装方式请参考前面一篇《Python3对称加密算法AES、DES3》rsa 加解密的库使用 pip3…

python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营

第三次参加百度的7天训练营了这次参加的主题是【Python小白逆袭大神】,不过你别看是小白逆势。。。除非你一开始参加就逆袭完,不然你真的是python小白,这个课程还是有难难度的。说一下个训练营的特点版。这个营从python一些基础练习-->数据…

潍坊学院的计算机类怎么样,潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!...

潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!潍坊学院教育技术学专业怎么样?有知道的…

elasticsearch配置文件详解

elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就…

Scala 入门3(类、Trait、模式匹配、正则、异常、提取器、IO)

文章目录1. 类和对象2. Trait3. 模式匹配4. 正则5. 异常处理6. 提取器7. 文件 IO学自 https://www.runoob.com/scala/scala-tutorial.html 1. 类和对象 object myClass {import java.io._class Point(xc : Int, yc : Int){var x : Int xcvar y : Int ycdef move(dx:Int, dy…

The Power of Android Action Bars(转载)

转自:http://www.informit.com/articles/article.aspx?p1743642转载于:https://www.cnblogs.com/lance-ehf/p/4285239.html