嵌套项目结构中导入自定义Python包对象遇ModuleNotFoundError
解决YOLOv7自定义包装器导入时的ModuleNotFoundError问题
我正在开发图像处理流水线,用YOLOv7检测人体Bounding Box。自定义了可通过pip安装的包装器YOLOv7Detector,在YOLOWrapper.py内部测试时能正常创建Detector()对象处理图像,但从runAnalysis.py导入YOLOInferenceSingleton时,触发ModuleNotFoundError,提示找不到models.common模块。
当前项目结构
src/ ├── urlProcessor/ │ ├── models/ │ │ ├── __init__.py │ │ ├── YOLOWrapper.py │ │ └── yolov7.pt │ ├── __init__.py │ └── runAnalysis.py └── other_stuff/
自定义包装器结构
YOLOv7Detector ├── /yolov7/ <---- 原始YOLOv7实现仓库,包装器从此处导入代码 ├── __init__.py ├── image_funcs.py └── model.py <---- 包装器的核心导入文件
此前尝试过的无效方案:
- 在
models目录的__init__.py中配置导入 - 在
runAnalysis.py中添加models路径到sys.path
可行解决方案
1. 修正包装器内的相对导入路径
问题根源是包装器model.py中使用了绝对导入(如import models.common),当从外部项目导入包装器时,Python会优先搜索当前项目的models目录,而非包装器内yolov7下的models。
修改包装器model.py中的导入语句为相对导入:
# 替换原绝对导入语句 from .yolov7.models.common import *
2. 确保包装器打包时包含yolov7子模块
检查setup.py或pyproject.toml,确保yolov7目录被正确纳入打包范围:
- 若用
setup.py:
from setuptools import setup, find_packages setup( name="YOLOv7Detector", packages=find_packages(include=["YOLOv7Detector", "YOLOv7Detector.yolov7", "YOLOv7Detector.yolov7.*"]), # 其他配置项... )
- 若用
pyproject.toml:
[tool.setuptools.packages.find] where = ["."] include = ["YOLOv7Detector*"]
3. 在runAnalysis.py中优先指定包装器路径
若暂时无法修改包装器代码,可在runAnalysis.py最顶部添加代码,将包装器内的yolov7目录加入sys.path最前端:
import sys from pathlib import Path import YOLOv7Detector # 获取包装器内yolov7目录的绝对路径 yolov7_path = Path(YOLOv7Detector.__file__).parent / "yolov7" sys.path.insert(0, str(yolov7_path)) # 再执行导入操作 from models.YOLOWrapper import YOLOInferenceSingleton
4. 验证虚拟环境一致性
确认测试YOLOWrapper.py和运行runAnalysis.py使用的是同一个虚拟环境,避免环境差异导致的模块路径冲突。
内容的提问来源于stack exchange,提问作者Soogey
相关产品推荐
相关产品推荐

