为什么Python导入旧版本模块而非当前工作目录的新版本模块?
问题原因
- 模块缓存机制:Python首次导入任意模块后,会将模块对象缓存到全局的
sys.modules字典中,后续所有同名import操作都会直接返回缓存的对象,不会重新扫描路径加载新文件,这是Python为提升导入效率做的默认优化。 - 模块搜索路径优先级问题:如果旧版本
plu模块所在的目录在sys.path中的排序早于当前工作目录,即使没有缓存,Python也会优先找到旧版本模块加载。
解决方法
1. 清除模块缓存(实现不记忆模块位置的需求)
直接删除sys.modules中对应的缓存条目即可,操作后Python再次导入同名模块时会重新扫描路径:
import sys # 移除已缓存的plu模块 if 'plu' in sys.modules: del sys.modules['plu']
2. 强制加载当前目录的新版本模块
两种常用方案可选:
方案1:临时调整搜索路径优先级
在导入前将当前工作目录插入到sys.path最开头,确保Python优先搜索当前目录:
import sys, os # 先清理旧缓存 if 'plu' in sys.modules: del sys.modules['plu'] # 将当前工作目录加到搜索路径最前面 sys.path.insert(0, os.getcwd()) # 此时导入的就是当前目录的新版本 import plu
方案2:指定路径直接加载
如果不想修改全局搜索路径,可以通过importlib直接指定新版本模块的路径加载,完全规避搜索路径的影响:
import importlib.util import os # 指定当前目录下plu模块的路径,单文件模块对应plu.py,包则对应__init__.py路径 plu_path = os.path.join(os.getcwd(), 'plu.py') spec = importlib.util.spec_from_file_location("plu", plu_path) plu = importlib.util.module_from_spec(spec) spec.loader.exec_module(plu) # 此时plu就是当前目录下的新版本模块对象
内容的提问来源于stack exchange,提问作者hex93
相关产品推荐
相关产品推荐

