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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:32