AWS Lambda运行时模块导入异常:如何映射ultralytics.yolo为yolov5
解决AWS Lambda中导入yolov5时出现的'ultralytics.yolo'模块找不到问题
问题背景
将Docker镜像上传至ECR后,在AWS Lambda运行时触发错误:找不到模块'ultralytics.yolo',无法导入app.py。但app.py中仅引用yolov5相关模块:
import yolov5 from yolov5.utils.general import (cv2, xyxy2xywh) ...
实际通过pip安装的是ultralytics/yolov5的fork版本,ultralytics是其依赖项,容器内/var/task目录下已存在ultralytics和yolov5目录。
核心原因
你安装的yolov5 pip包内部代码中存在对ultralytics.yolo的隐式引用,但Lambda运行环境中该模块的路径映射存在问题,导致无法找到对应模块。
解决方案:通过模块映射解决
可以通过将ultralytics.yolo映射到已存在的yolov5模块来解决,具体有两种可行方式:
方法1:在Docker镜像中创建软链接
在Dockerfile中添加以下命令,在依赖目录下创建软链接,把yolov5目录映射为ultralytics/yolo:
RUN ln -s /var/task/yolov5 /var/task/ultralytics/yolo
构建镜像时执行该命令,即可让Python在查找ultralytics.yolo时指向已安装的yolov5模块。
方法2:在app.py开头添加模块映射代码
直接在app.py的最顶部添加代码,手动将ultralytics.yolo模块指向已导入的yolov5:
import sys import yolov5 # 将ultralytics.yolo映射到已加载的yolov5模块 sys.modules['ultralytics.yolo'] = yolov5 sys.modules['ultralytics.yolo.utils'] = yolov5.utils # 如果有更深层的子模块,可按需添加映射
这种方式无需修改Docker镜像,直接通过代码调整模块查找路径。
验证
完成上述操作后,重新构建镜像并上传至ECR,测试Lambda函数确认是否仍出现模块找不到的错误。
内容的提问来源于stack exchange,提问作者Robb
相关产品推荐
相关产品推荐

