|
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 imp
- fp, pathname, desc = imp.find_module('WEB', ['./plugins',])
- imp.load_module('WEB', fp, pathname, desc)
这个错误,在使用”import WEB“时不会出现。内容如下:
可见imp在导入模块时,搜索方法和import并不相同。”import WEB“导入时,执行WEB.py文件中的”import PAD“语句,import会在WEB.py的当前目录下查找PAD.py, 而imp只会在sys.path中查找。将test.py的内容改为如下时,则无此异常。
- import sys
- sys.path.append('./plugins')
- import imp
- fp, 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'
test.py内容为如下时,sys.modules字典中对应的WEB模块的键值为:'WEB'
- import sys
- sys.path.append('./plugins')
- import WEB
使用imp导入时,test.py内容如下, sys.modules字典中对应的WEB模块的键值为:‘WEB’
- import imp
- fp, 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字典,存在则跳过。
|
|