python: import模块的相关问题

来源:互联网 发布:网络直播的商业模式 编辑:程序博客网 时间:2024/05/16 19:52

1. 使用imp.load_module时遇到"ImportError: No module named PAD"异常

文件的目录结构如下:
|--test.py  
|--plugins
             |--__init__.py
             |--PAD.py
             |--WEB.py     #包含“import PAD"
当在test.py文件中使用imp.load_module(‘WEB’, ...)动态导入WEB.py模块时,提示异常”ImportError: No module named PAD“。test.py的内容如下:
import impfp, pathname, desc = imp.find_module('WEB', ['./plugins',])imp.load_module('WEB', fp, pathname, desc)

这个错误,在使用”import WEB“时不会出现。内容如下:
import plugins.WEB

可见imp在导入模块时,搜索方法和import并不相同。”import WEB“导入时,执行WEB.py文件中的”import PAD“语句,import会在WEB.py的当前目录下查找PAD.py, 而imp只会在sys.path中查找。将test.py的内容改为如下时,则无此异常。
import syssys.path.append('./plugins')import impfp, pathname, desc = imp.find_module('WEB', ['./plugins',])imp.load_module('WEB', fp, pathname, desc)

2.模块被重复导入的可能情况

首先,再决定是否导入模块时,python是通过检查sys.modules来判断的。
test.py内容为如下时,sys.modules字典中对应的WEB模块的键值为:‘plugins.WEB'
import plugins.WEB

test.py内容为如下时,sys.modules字典中对应的WEB模块的键值为:'WEB'
import syssys.path.append('./plugins')import WEB

使用imp导入时,test.py内容如下, sys.modules字典中对应的WEB模块的键值为:‘WEB’
import impfp, pathname, desc = imp.find_module('WEB', ['./plugins',])imp.load_module('WEB', fp, pathname, desc)

总结,sys.modules字典中的键值是依据“到达模块的路径”得到的。如果将要导入模块的键值,不存在于sys.modules时,模块会被再次导入。存在,则不会再被导入。所以,当从不同的出发点(路径)尝试导入同一个模块时,这个模块是可能会被多次导入的。在某些情况下,这是需要注意的细节。

3.不同的导入方法的区别

imp.load_module: 不论模块是否存在,都再次导入。但是间接导入(模块中又使用import导入的其他模块),参照import的规则。
__import__: 检查sys.modules字典,存在则跳过。
import::检查sys.modules字典,存在则跳过。
原创粉丝点击