使用Serverless Framework部署Python ML模型时自定义模块导入失败排查
解决Serverless Framework部署时"my_submodule not found"的问题
我之前部署Python Serverless服务时也踩过类似的模块导入坑,结合你的仓库结构来看,这个问题基本集中在Python模块导入规则或者Serverless打包配置上,给你几个具体的排查和解决方向:
1. 先确认导入语句的正确性
在handler.py里导入子模块时,一定要使用完整的包路径,比如:
# 正确的绝对导入 from mysubpackage.my_submodule import your_function_or_class # 或者相对导入(handler和mysubpackage同目录时可用) from .mysubpackage.my_submodule import your_function_or_class
如果直接写import my_submodule,Python会在当前目录找这个文件,而不是mysubpackage子目录里的,肯定会报错。
2. 检查Serverless打包配置是否包含子包
Serverless Framework默认会打包handler所在目录的文件,但如果你的serverless.yml或引用的myfun.yml里有自定义的package配置,可能不小心把mysubpackage排除了。
打开这两个yaml文件,检查package字段:
- 如果有
exclude规则,确保没有把mysubpackage/**加入排除列表; - 如果用
include规则,一定要明确包含子包,比如:package: include: - handler.py - mysubpackage/** # 包含子包下所有文件 - requirements.txt
另外,如果你用了serverless-python-requirements插件,这个插件默认会处理PyPI依赖,但本地子包需要确保在打包范围内,上面的include配置也能覆盖这种情况。
3. 本地验证先排除环境问题
先在本地模拟运行,确认不是代码本身的问题:
- 直接运行
python handler.py(如果handler里有测试代码的话); - 或者用Serverless本地调用命令:
serverless invoke local -f your-function-name(替换成你的函数名)。
如果本地也报错,那就是导入路径的问题,和Serverless部署无关;如果本地正常,那肯定是打包时的配置问题。
4. 确保子包有__init__.py文件
Python要求每个包目录下必须有__init__.py文件(可以是空文件),才能被识别为可导入的包。去mysubpackage目录里看看,如果没有这个文件,新建一个空的__init__.py试试,很多时候这个小细节容易被忽略。
按照上面的步骤排查,应该能解决模块找不到的问题。
内容的提问来源于stack exchange,提问作者3nomis
相关产品推荐
相关产品推荐

