PyCharm运行脚本正常但调试时导入six模块触发KeyError报错
错误成因
- six模块懒加载与PyCharm调试机制冲突:six的
moves子模块采用懒加载设计,只有首次被访问时才会动态将对应模块注册到sys.modules中。PyCharm调试模式为了支持断点追踪、变量预览等功能,会提前扫描预加载导入的模块,此时six还未完成moves下模块的注册逻辑,直接访问sys.modules[fullname]就会抛出KeyError。 - 版本缺陷:1.14.0以下版本的six,动态注册逻辑没有适配调试器提前导入的场景,没有兜底创建逻辑,直接读取不存在的
sys.modules键就会触发异常。 - 模块重载逻辑干扰:你贴出的
load_module是导入钩子的标准实现,优先从sys.modules读取已加载模块,正常运行时six已完成注册所以能正常返回;但调试模式下如果触发模块预加载、自动重载逻辑,会临时清空sys.modules中six.moves相关的注册项,二次访问时就会找不到对应键。
修复方案
- 升级six到最新版本,执行命令:
pip install --upgrade six
新版本已经适配了调试场景的懒加载冲突。 - 临时规避:在导入six后手动触发
moves模块初始化,修改代码如下:
import six # 手动预注册urllib_parse到sys.modules,避免调试器预加载失败 six.moves.__getattr__('urllib_parse') from six.moves.urllib_parse import urljoin
- 调整PyCharm调试配置:关闭设置中「Build, Execution, Deployment > Python Debugger」下的「Load source code for non-project modules」选项,避免调试器提前扫描第三方模块的导入内容。
内容的提问来源于stack exchange,提问作者Chris McL
相关产品推荐
相关产品推荐

