自定义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/子目录下,不在顶级搜索路径内,因此无法找到。
修复方案
两种可行的修复方式:
- 改用相对导入:在
lambda_function.py中修改导入语句:
明确指定从当前模块所在目录导入from . import runnerrunner。 - 添加子目录到搜索路径:在
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
相关产品推荐
相关产品推荐

