You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:15:01