除了 sys.path python 在导入包时会寻找什么地方



场景

从一个包中,假设beta
修改sys.path后,导入包alpha然后还原sys.path。我尝试导入一个同时存在于alphabeta中的模块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.barfoo.bar.baz。每个键的值为 对应的模块对象。

在导入过程中,模块名称在sys.modules中查找,如果 存在,关联的值是满足导入的模块,并且 该过程完成。但是,如果值为None,则ModuleNotFoundError被提出。如果缺少模块名称,Python 将继续搜索模块。

阅读更多关于它的信息 这里 https://docs.python.org/3/reference/import.html#the-module-cache.

最新更新