0

设想

从一个包让我们说beta
修改后sys.path,导入一个包alpha然后恢复sys.path. 我尝试导入一个data_provider同时存在于alphabeta

问题是:即使 sys.path 现在没有's 目录的痕迹,data_providerin也会alpha被选中betaalpha

问题:sys.path这是一个错误,还是python 在尝试导入模块时查看的其他地方(可能是缓存)

代码

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__)

完整的代码库可以在这里找到

4

1 回答 1

1

导入搜索期间检查的第一个位置是sys.modules. 此映射用作先前已导入的所有模块的缓存,包括中间路径。因此,如果foo.bar.baz之前已导入,sys.modules将包含foofoo.bar和的条目foo.bar.baz。每个键都将具有相应的模块对象作为其值。

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

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

于 2021-06-16T12:06:07.090 回答