You need to enable JavaScript to run this app. Django项目部署Heroku出现AttributeError找不到自定义函数myfunctionname如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Django项目部署Heroku出现AttributeError找不到自定义函数myfunctionname如何解决

问题根因

你的报错属于Python pickle反序列化的模块路径不匹配问题:

  • 本地序列化(通过pickle.dump保存)包含myfunctionname的对象(多为机器学习模型、自定义预处理管道等)时,pickle会记录该函数所属的模块名。如果本地序列化时是在直接运行的测试脚本(即__main__模块)中使用该函数,pickle会将其所属模块标记为__main__
  • 部署到Heroku后,服务通过gunicorn启动,运行时的__main__模块是gunicorn的启动入口,不是你项目中的自定义模块,因此反序列化时找不到__main__.myfunctionname,触发报错
解决方案

按优先级从高到低选择即可:

  1. 重新生成序列化文件(最稳定)
    本地序列化对象时,必须从正式的包路径导入函数后再序列化,不要在直接运行的测试脚本里直接定义函数就执行dump操作:

    # 本地序列化时的正确写法
    from defspack.defs import myfunctionname
    # 接下来定义/训练用到该函数的模型,再执行pickle.dump
    

    这样pickle会记录函数的真实模块路径defspack.defs.myfunctionname,线上就能正常导入找到。

  2. 临时兼容已有序列化文件
    如果不想重新生成pickle文件,可以在项目中反序列化pickle的代码前,手动将函数注册到__main__模块:

    import __main__
    from defspack.defs import myfunctionname
    # 手动把函数挂载到运行时的__main__模块下
    __main__.myfunctionname = myfunctionname
    
    # 再执行你的反序列化代码
    # obj = pickle.load(xxx)
    
  3. 检查项目基础配置
    确认两个基础配置没有问题:

    • 你的defspack文件夹下必须有一个空的__init__.py文件,标记该文件夹为Python可导入的包,Heroku部署时才能正常识别导入
    • requirements.txt中已经添加了numpy以及你用到的其他所有依赖,避免依赖缺失导致自定义模块导入失败,连带触发函数找不到的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:57:04