Python2.7导入自定义模块报cannot import name submodule错误
Python2.7循环导入报错解决方案
问题根因
该报错由Python2.7的导入机制特性导致:执行import module时会先创建未完全初始化的module模块对象,执行module/__init__.py的from module import submodule时开始加载子模块,加载过程中test.py尝试从还未初始化完成的module中获取submodule,此时submodule还未绑定到module的命名空间,因此抛出导入错误。Python3优化了导入阶段的命名空间绑定逻辑,所以不会触发该问题。
可行方案
方案1:延迟导入(改动最小,推荐)
将test.py中的导入逻辑移到实际使用submodule的代码块内部,避开模块初始化阶段的循环依赖:
# module/submodule/test.py # 移除顶层的from module import submodule def your_function(): from module import submodule # 此处编写使用submodule的逻辑
如果需要全局引用submodule,可以用延迟初始化的写法:
# module/submodule/test.py submodule = None def _init_dep(): global submodule from module import submodule _init_dep()
方案2:修改导入写法
在所有文件开头开启Python3风格的绝对导入,改用全路径导入代替从父模块取子模块的写法:
# 所有.py文件第一行添加 from __future__ import absolute_import
# module/__init__.py from __future__ import absolute_import import module.submodule as submodule
# module/submodule/test.py from __future__ import absolute_import import module.submodule # 后续使用时直接调用module.submodule即可
方案3:手动调整初始化顺序
在module/__init__.py中提前给submodule做命名空间占位,避免导入时找不到属性:
# module/__init__.py import sys submodule = sys.modules.get('module.submodule') from module import submodule
以上三种方案均无需调整现有目录结构,可直接在Python2.7环境下运行。
内容的提问来源于stack exchange,提问作者Nigel Davis
相关产品推荐
相关产品推荐

