You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask应用中Pickle加载自定义Preset类报错:无法获取属性Preset

解决Flask环境下Pickle加载自定义类失败的问题

问题根源

当你在终端直接运行setup脚本时,Preset类定义在__main__模块中,pickle序列化时会将类的归属模块记录为__main__。但在Flask环境启动时,Flask的启动脚本成为了新的__main__模块,而你的Preset类此时属于其他模块,导致pickle无法在当前__main__中找到该类。

具体解决方案

1. 将自定义类移至独立模块(推荐)

把Preset类单独放在一个模块文件中,比如presets.py:

# presets.py
class Preset:
    def __init__(self, name, config):
        self.name = name
        self.config = config

在setup脚本和Flask应用中,统一从该模块导入Preset:

from presets import Preset

这样无论哪种运行方式,pickle序列化和反序列化时,类的模块路径都是presets.Preset,不会出现模块不匹配的问题。

2. 手动指定类的模块归属(临时方案)

如果暂时不想移动类,在setup脚本中定义Preset类后,手动修改其__module__属性,强制指定序列化时的模块路径:

class Preset:
    # 类定义...

# 指定模块名,比如你的主脚本叫app.py,就填'app'
Preset.__module__ = 'presets'

注意:后续在Flask环境中加载时,必须从指定的模块中导入Preset类。

3. 确保加载时的模块一致性

在Flask应用中加载pickle文件前,务必确保已经从正确的模块导入了Preset类,不能在加载时临时定义类结构——pickle依赖类的模块路径和结构完全匹配才能正确反序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:44:59