导入collections的Counter报错 分析matplotlib代码库出现循环导入问题
报错根本原因
1. 模块命名冲突触发导入优先级错误
Python导入模块时会优先查询当前运行脚本所在的目录,你将自己写的analyse_code.py放在了matplotlib的官方安装目录/usr/local/lib/python3.9/site-packages/matplotlib/下,而该目录刚好存在matplotlib自带的collections.py文件。当你执行from collections import Counter时,Python没有加载标准库的collections模块,反而优先匹配到了同目录下的matplotlib自有collections.py。
2. 循环导入链路触发最终报错
matplotlib的collections.py加载时会依赖numpy,numpy依赖json模块,json依赖re正则模块,re又依赖functools模块,而functools的底层需要从标准库collections中导入namedtuple。此时Python检测到名为collections的模块已经处于半加载状态(就是还没加载完的matplotlib自有collections.py),该模块中既没有namedtuple也没有Counter,因此抛出了循环导入相关的报错。
解决办法
- 将你编写的
analyse_code.py从matplotlib的安装目录中移出,放到独立的、和第三方库安装路径无关的自定义项目目录下运行,即可直接解决冲突 - 日常开发时不要给自建的Python脚本起和标准库重名的名称(比如不要命名为
collections.py、re.py、json.py等),也不要将自定义脚本放在第三方库的安装目录下,避免触发导入优先级问题 - 若特殊场景下确实无法规避重名,可以通过指定绝对导入路径加载标准库模块,该方案仅作为极端场景的备用选择。
内容的提问来源于stack exchange,提问作者Herman
相关产品推荐
相关产品推荐

