移除sys.path中的模块路径后为何仍能重新导入该模块?
为什么移除sys.path路径后仍能导入已加载的同名模块?
这是因为Python的模块导入机制依赖全局模块缓存,具体原因如下:
Python在成功导入一个模块后,会把该模块的对象存入sys.modules字典中做缓存——只要当前Python解释器进程没有重启,这个缓存就会一直保留。
结合你的测试过程具体分析:
- 当你第一次将
/root加入sys.path并导入pttest模块后,Python已经把模块加载到内存,同时在sys.modules中注册了'pttest'对应的模块对象。 - 后续你移除
sys.path中的/root、删除局部的pttest变量,只是清理了路径列表和当前作用域的变量,但**sys.modules里的模块缓存完全没被改动**。 - 再次执行
from pttest import pttest时,Python会优先检查sys.modules,发现缓存中存在该模块,就直接从缓存读取内容,不会再去遍历sys.path查找新的模块文件。
如果需要重新导入不同路径下的同名模块,得先清除缓存:
import sys # 移除模块缓存 if 'pttest' in sys.modules: del sys.modules['pttest'] # 修改sys.path为目标路径 sys.path.insert(0, "/新的模块路径") # 重新导入 from pttest import pttest
内容的提问来源于stack exchange,提问作者user1159290
相关产品推荐
相关产品推荐

