Django项目部署Heroku出现AttributeError找不到自定义函数myfunctionname如何解决
问题根因
你的报错属于Python pickle反序列化的模块路径不匹配问题:
- 本地序列化(通过
pickle.dump保存)包含myfunctionname的对象(多为机器学习模型、自定义预处理管道等)时,pickle会记录该函数所属的模块名。如果本地序列化时是在直接运行的测试脚本(即__main__模块)中使用该函数,pickle会将其所属模块标记为__main__ - 部署到Heroku后,服务通过gunicorn启动,运行时的
__main__模块是gunicorn的启动入口,不是你项目中的自定义模块,因此反序列化时找不到__main__.myfunctionname,触发报错
解决方案
按优先级从高到低选择即可:
重新生成序列化文件(最稳定)
本地序列化对象时,必须从正式的包路径导入函数后再序列化,不要在直接运行的测试脚本里直接定义函数就执行dump操作:# 本地序列化时的正确写法 from defspack.defs import myfunctionname # 接下来定义/训练用到该函数的模型,再执行pickle.dump这样pickle会记录函数的真实模块路径
defspack.defs.myfunctionname,线上就能正常导入找到。临时兼容已有序列化文件
如果不想重新生成pickle文件,可以在项目中反序列化pickle的代码前,手动将函数注册到__main__模块:import __main__ from defspack.defs import myfunctionname # 手动把函数挂载到运行时的__main__模块下 __main__.myfunctionname = myfunctionname # 再执行你的反序列化代码 # obj = pickle.load(xxx)检查项目基础配置
确认两个基础配置没有问题:- 你的
defspack文件夹下必须有一个空的__init__.py文件,标记该文件夹为Python可导入的包,Heroku部署时才能正常识别导入 requirements.txt中已经添加了numpy以及你用到的其他所有依赖,避免依赖缺失导致自定义模块导入失败,连带触发函数找不到的问题
- 你的
内容的提问来源于stack exchange,提问作者ishSparks
相关产品推荐
相关产品推荐

