Python导入错误:同名包与模块冲突问题求解
问题分析
你遇到的问题是Python导入机制的优先级导致的:当pack1包下同时存在同名的mod1目录(带__init__.py,属于Python包)和mod1.py文件时,解释器会优先把mod1识别为包,而非.py模块。所以你执行from pack1 import mod1时,实际导入的是pack1/mod1/这个包,而不是pack1/mod1.py,自然找不到Mod1Class。
解决方案
下面提供几种可行的解决方式,按推荐程度排序:
1. 重命名mod1.py(最推荐)
直接把pack1/mod1.py改个名字,比如pack1/mod1_core.py,彻底避免命名冲突,导入逻辑也更清晰。修改main.py的导入语句:
from pack1.mod1_core import Mod1Class from pack1.mod1.request import Mod1Request my_class = Mod1Class() my_request = Mod1Request() if __name__ == '__main__': print(repr(my_request)) print(repr(my_class))
2. 动态导入mod1.py模块
如果不想修改文件名,可以用importlib模块动态导入mod1.py,绕过默认的优先级规则。修改main.py:
import importlib.util import sys from pack1.mod1.request import Mod1Request # 动态加载pack1/mod1.py模块 spec = importlib.util.spec_from_file_location("pack1.mod1_file", "pack1/mod1.py") mod1_file = importlib.util.module_from_spec(spec) sys.modules["pack1.mod1_file"] = mod1_file spec.loader.exec_module(mod1_file) my_class = mod1_file.Mod1Class() my_request = Mod1Request() if __name__ == '__main__': print(repr(my_request)) print(repr(my_class))
3. 调整包的导入结构(进阶)
在pack1/__init__.py中显式区分包和模块的导入,统一对外导出:
# pack1/__init__.py import importlib.util import sys # 导入mod1.py并命名为mod1_module spec = importlib.util.spec_from_file_location("pack1.mod1_module", "pack1/mod1.py") mod1_module = importlib.util.module_from_spec(spec) sys.modules["pack1.mod1_module"] = mod1_module spec.loader.exec_module(mod1_module) # 直接导出Mod1Class,简化外部导入 Mod1Class = mod1_module.Mod1Class
然后在main.py中直接导入:
from pack1 import Mod1Class from pack1.mod1.request import Mod1Request my_class = Mod1Class() my_request = Mod1Request() if __name__ == '__main__': print(repr(my_request)) print(repr(my_class))
内容的提问来源于stack exchange,提问作者Wayne Hong
相关产品推荐
相关产品推荐

