导入包时python查找sys.path以外的地方 场景代码

问题描述

场景

假设从一个包中beta
修改 sys.path 后,导入包 alpha 然后还原 sys.path。我尝试导入同时存在data_provideralpha

中的模块 beta

问题是: data_provider 中的 alphabeta 选中,即使 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__)

可以找到完整的代码here

解决方法

导入搜索时检查的第一个位置是 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阅读更多相关信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...