python: import模块的相关问题

本文探讨了Python中import模块时可能遇到的问题,包括使用imp.load_module时的'ImportError: No module named PAD'异常,分析了模块可能被重复导入的原因,并详细比较了不同导入方法之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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“时不会出现。内容如下:
import plugins.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'
import 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字典,存在则跳过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值