import reload __import__在python中的区别
当前位置:以往代写 > Python教程 >import reload __import__在python中的区别
2019-06-14

import reload __import__在python中的区别

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')    #这次就不会打印动静了

    关键字:

在线提交作业