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

自定义Lambda镜像遇ImportModuleError:找不到'runner'模块问题咨询

问题分析与解决方案

错误原因

报错No module named 'runner'的核心是Python模块导入路径不匹配:

  • lambda_function.py位于a/driver/v1/目录下,若使用import runner的绝对导入方式,Python会在sys.path的顶级目录中查找runner模块,但runner.py在a/driver/v1/子目录下,不在顶级搜索路径内,因此无法找到。

修复方案

两种可行的修复方式:

  1. 改用相对导入:在lambda_function.py中修改导入语句:
    from . import runner
    
    明确指定从当前模块所在目录导入runner。
  2. 添加子目录到搜索路径:在lambda_function.py开头加入代码,将脚本所在目录加入sys.path:
    import sys
    from pathlib import Path
    sys.path.append(str(Path(__file__).parent))
    

疑问解答

1. Lambda代码是否要求处理程序文件必须处于根目录?

不需要。Lambda允许处理程序位于任意子目录,只需满足两个条件:

  • Dockerfile的CMD参数需用Python模块路径格式(.分隔目录,而非/)指定处理程序,比如你的场景应写成a.driver.v1.lambda_function.lambda_handler。
  • 处理程序所在的每个目录需包含__init__.py文件(空文件即可),让Python识别为可导入的模块。

2. awslambdaric可放在父目录还是必须与处理程序文件同级?

awslambdaric不需要与处理程序同级,只要它所在的目录在Python的sys.path中即可。你的Dockerfile将其安装到${FUNCTION_DIR}/a/,且工作目录设为该路径,此目录默认会被加入sys.path,Python能正常找到awslambdaric模块,完全符合要求。


Fargate与Lambda运行差异的原因

Fargate能正常运行是因为执行逻辑不同:

  • Fargate通常直接执行脚本,工作目录可能设为a/driver/v1/,此时当前目录会被加入sys.path,import runner自然能找到模块。
  • Lambda通过awslambdaric启动,工作目录为${FUNCTION_DIR}/a/,sys.path默认包含该顶级目录,但不包含子目录a/driver/v1/,因此出现导入错误。

内容的提问来源于stack exchange,提问作者m00s3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:11:23