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

嵌套项目结构中导入自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:05:09