AWS Lambda容器部署报错:attempted relative import beyond top-level package 求助
AWS Lambda容器部署报错:attempted relative import beyond top-level package 求助
碰到这个问题我太熟了!咱们一步步来排查解决:
问题根源分析
你的Dockerfile把整个source目录复制到了${LAMBDA_TASK_ROOT}/source/,而Lambda的Python运行环境默认只会把${LAMBDA_TASK_ROOT}(也就是/var/task)加入Python的模块搜索路径sys.path。这就导致:
main.py实际在/var/task/source/里- 当Lambda加载
source.main.real_estate_scraper时,main.py里的from real_estate_prices.spiders...导入会去/var/task下找real_estate_prices包,但它实际在/var/task/source/里 - Python找不到目标包,就抛出了这个导入错误
解决方案(两种任选其一)
方案一:直接将source内容放到Lambda任务根目录(最推荐)
修改Dockerfile,把source下的所有内容直接复制到${LAMBDA_TASK_ROOT},消除嵌套目录的问题:
FROM public.ecr.aws/lambda/python:3.11 # 复制source下的依赖文件到任务根目录 COPY source/requirements.txt ${LAMBDA_TASK_ROOT} # 安装依赖 RUN pip install -r requirements.txt # 复制source下所有内容到任务根目录 COPY source/ ${LAMBDA_TASK_ROOT}/ # 现在main.py在任务根目录,直接指定入口 CMD ["main.real_estate_scraper"]
这样修改后,real_estate_prices包和main.py都在Python的默认搜索路径下,导入问题直接解决。
方案二:保留source目录结构,调整Python路径
如果不想改变目录结构,可以通过设置环境变量或手动添加路径让Python找到source下的包:
修改Dockerfile,添加PYTHONPATH环境变量:
FROM public.ecr.aws/lambda/python:3.11 COPY source/requirements.txt ${LAMBDA_TASK_ROOT}/source/ RUN pip install -r ${LAMBDA_TASK_ROOT}/source/requirements.txt COPY source ${LAMBDA_TASK_ROOT}/source/ # 将source目录加入Python模块搜索路径 ENV PYTHONPATH="${LAMBDA_TASK_ROOT}/source" # 现在Python能直接找到main模块,调整入口指向 CMD ["main.real_estate_scraper"]
或者也可以在main.py开头手动添加路径:
import sys import os # 把当前脚本所在目录(source目录)加入搜索路径 sys.path.append(os.path.dirname(os.path.abspath(__file__))) # 后续导入代码保持不变 from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings ...
额外注意事项
- 检查你的
scrapy.cfg配置文件,确保默认设置指向正确的settings模块:[settings] default = real_estate_prices.settings - Scrapy爬虫运行需要一定内存,建议把Lambda容器的内存配置调高一些(比如至少512MB),避免运行时内存不足。
备注:内容来源于stack exchange,提问作者KurczakChrupiacy2
相关产品推荐
相关产品推荐

