import
浸染:导入/引入一个python尺度模块,个中包罗.py文件、带有__init__.py文件的目次(自界说模块)。
import module_name[,module1,…]
from module import *|child[,child1,…]
留意:多次反复利用import语句时,不会从头加载被指定的模块,只是把对该模块的内存地点给引用到当地变量情况。
实例:
pythontab.py
#!/usr/bin/env python #encoding: utf-8 import os print 'in pythontab',id(os)
test.py
#!/usr/bin/env python #encoding: utf-8 import pythontab #第一次会打印pythontab内里的语句 import os #再次导入os后,其内存地点和pythontab内里的是一样的,因此这里只是对os的当地引用 print 'in c',id(os) import pythontab #第二次不会打印pythontab内里的语句,因为没有从头加载
reload
浸染:对已经加载的模块举办从头加载,一般用于原模块有变革等非凡环境,reload前该模块必需已经import过。
import os
reload(os)
说明:
reload会从头加载已加载的模块,但本来已经利用的实例照旧会利用旧的模块,而新出产的实例会利用新的模块;reload后照旧用本来的内存地点;不能支持from。。import。。名目标模块举办从头加载。
实例:
pythontab.py
#!/usr/bin/env python #encoding: utf-8 import os print 'in pythontab',id(os)
test.py
#!/usr/bin/env python #encoding: utf-8 import pythontab #第一次import会打印pythontab内里的语句 print id(pythontab) #本来pythontab的内存地点 reload(pythontab) #第二次reload还会打印pythontab内里的语句,因为有从头加载 print id(pythontab) #reload后pythontab的内存地点,和本来一样
扩展:
上面说了,在非凡环境的下才会利用reload函数;除了本来模块文件有修改外,尚有哪些环境需要利用reload函数呢,这里举个例子。
#!/usr/bin/env python #encoding: utf-8 import sys #引用sys模块进来,并不是举办sys的第一次加载 reload(sys) #从头加载sys sys.setdefaultencoding('utf8') ##挪用setdefaultencoding函数
上面的代码是正确的,再测试下面的代码
#!/usr/bin/env python #encoding: utf-8 import sys sys.setdefaultencoding('utf8')
上面的测试会失败,那么为什么要在挪用setdefaultencoding时必需要先reload一次sys模块呢?因为这里的import语句其实并不是sys的第一次导入语句,也就是说这里其实大概是第二、三次举办sys模块的import,这里只是一个对sys的引用,只能reload才气举办从头加载;那么为什么要从头加载,而直接引用过来则不能挪用该函数呢?因为setdefaultencoding函数在被系统挪用后被删除了,所以通过import引用进来时其实已经没有了,所以必需reload一次sys模块,这样setdefaultencoding才会为可用,才气在代码里修改表明器当前的字符编码。试试下面的代码,同样会报错:
#!/usr/bin/env python #encoding: utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') del sys.setdefaultencoding ##删除本来的setdefaultencoding函数 sys.setdefaultencoding('gb2312')
那么到底是谁在之前就导入sys而且挪用了setdefaultencoding函数呢?谜底就在python安装目次的Lib文件夹下,有一个叫site.py的文件【python2.6】,在内里可以找到main() –> setencoding()–>sys.setdefaultencoding(encoding),因为这个site.py每次启动python表明器时会自动加载,所以main函数每次城市被执行,setdefaultencoding函数一出来就已经被删除了。
__import__
浸染:
同import语句同样的成果,但__import__是一个函数,而且只吸收字符串作为参数,所以它的浸染就可想而知了。其实import语句就是挪用这个函数举办导入事情的,import sys <==>sys = __import__('sys')
利用:
__import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals(),[]
__import__('os')
__import__('os',globals(),locals(),['path','pip']) #等价于from os import path, pip
说明:
#p#分页标题#e#
凡是在动态加载时可以利用到这个函数,好比你但愿加载某个文件夹下的所用模块,可是其下的模块名称又会常常变革时,就可以利用这个函数动态加载所有模块了,最常见的场景就是插件成果的支持。
扩展:
既然可以通过字符串来动态导入模块,那么是否可以通过字符串动态从头加载模块吗?试试reload('os')直接报错,是不是没有其他方法呢?固然不能直接reload可是可以先unimport一个模块,然后再__import__来从头加载模块。此刻看看unimport操纵如何实现,在Python表明里可以通过globals(),locals(),vars(),dir()等函数查察到当前情况下加载的模块及其位置,可是这些都只能看不能删除,所以无法unimport;不外除此之外尚有一个处所是专门存放模块的,这就是sys.modules,通过sys.modules可以查察所有的已加载而且乐成的模块,并且比globals要多,说明默认会加载一些特另外模块,接下来就是unimport了。
#!/usr/bin/env python #encoding: utf-8 import sys __import__('a') #第一次导入会打印动静 del sys.modules['a'] #unimport __import__('a') #再次导入照旧会打印动静,因为已经unimport一次了 __import__('a') #这次就不会打印动静了