Mypy报错:同一源文件存在两个模块名,导入方式引发运行问题
解决Mypy模块重复识别与导入运行问题
问题根源
- Mypy报错是因为同一个
registry.py文件被识别为两个不同模块名:registry和src.homework.homework_1.registry,本质是项目源码根目录不统一——CI或本地环境同时把homework_1和src目录加入了Python模块搜索路径(PYTHONPATH),导致Mypy判定文件重复。 - 改用相对导入后无法运行,是因为直接执行脚本(如
python3 actions.py)时,脚本被当作顶层文件而非包的一部分,相对导入规则不生效;PyCharm运行失败则是因为源码根配置与导入方式不匹配。
解决方案
1. 统一源码根目录配置
- 本地PyCharm设置:右键项目中的
src目录 → 选择Mark Directory as→Sources Root,让PyCharm将src作为模块搜索的根目录。 - CI环境配置:在GitHub CI脚本中添加命令,把项目根目录加入PYTHONPATH,确保Python能正确识别
src下的包结构:export PYTHONPATH="$PYTHONPATH:$(pwd)"
2. 使用规范的绝对导入
在actions.py中,基于src作为源码根使用绝对导入(无需带src前缀,因为src已被设为Sources Root或加入PYTHONPATH),同时避免使用import *,明确导入需要的成员:
from homework.homework_1.registry import 目标类/函数名
这样Mypy只会识别homework.homework_1.registry这唯一模块名,不会再触发重复报错。
3. 正确运行项目
不要直接执行脚本文件,改用模块方式启动,确保脚本被当作包的一部分加载:
# 如果PYTHONPATH指向项目根目录 python3 -m src.homework.actions # 若src已设为Sources Root,可简化为 python3 -m homework.actions
这种方式既能让相对导入生效(如果选择使用的话),也能让PyCharm正常运行项目。
额外优化建议
在项目根目录创建pyproject.toml,配置Mypy的源码根,确保本地与CI环境的Mypy行为一致:
[tool.mypy] python_version = "3.x" # 替换为你的实际Python版本 strict = true packages = ["src"]
内容的提问来源于stack exchange,提问作者Iraedeus
相关产品推荐
相关产品推荐

