问题描述
场景
假设从一个包中beta
:
修改 sys.path
后,导入包 alpha
然后还原 sys.path
。我尝试导入同时存在于 data_provider
和 alpha
beta
问题是: data_provider
中的 alpha
被 beta
选中,即使 sys.path 现在没有 alpha
' 的痕迹s目录
问题:这是一个错误,还是 python 在尝试导入模块时查看的除 sys.path
(可能是缓存)之外的其他地方
代码
import os,sys
sys.path.insert(0,os.path.join(os.path.dirname(os.path.abspath(__file__)),"src"))
sys.path.insert(0,'../alpha')
import alpha
sys.path.remove('../alpha')
import data_provider as dp
print(sys.path)
print(dp.__file__)
解决方法
导入搜索时检查的第一个位置是 sys.modules
。这
映射作为所有模块的缓存
导入,包括中间路径。所以如果 foo.bar.baz
是
之前导入的,sys.modules
将包含 foo
的条目,
foo.bar
和 foo.bar.baz
。每个键都将作为其值
对应的模块对象。
在导入过程中,模块名称在 sys.modules
中查找,如果
当前,关联值是满足导入的模块,并且
过程完成。但是,如果值为 None
,则
ModuleNotFoundError
被提升。如果缺少模块名称,Python
将继续搜索模块。
在此处https://docs.python.org/3/reference/import.html#the-module-cache阅读更多相关信息。