场景
从一个包中,假设beta
:
修改sys.path
后,导入包alpha
然后还原sys.path
。我尝试导入一个同时存在于alpha
和beta
中的模块data_provider
问题是:alpha
中的data_provider
被选中beta
即使sys.path现在没有alpha
目录的痕迹
。问题:这是一个错误,还是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.