我正在尝试加载 pickle 并通过Flask应用程序显示一些数据。我遵循的结构如下。

package1.py

class myclass:
    #do something
m = myclass()
pickle.load(m,filehandle)

package2.py
from package1 import myclass
def query_processor(params):
    x = pickle.load(filehandle)
    #do stuff on x using params
    return results
if __name__ == "__main__":
    print(query_processor(params)) #Works as expected

flaskapp.py
import package2

@app.route("/", methods=['GET', 'POST'])
def hello():
    result = package2.query_processor(params)
    return render_template(template_name,form=form,msg=result)

在flaskapp内,出现类似以下错误:
AttributeError: Can't get attribute 'myclass' on <module '__main__' from <flask_path>

有什么办法可以解决此问题?有人可以解释为什么我遇到此错误吗?

最佳答案

为了 pickle ,与 pickle 对象的时间点相比,您需要具有完全相同的模块和包装结构。

您的异常(exception)情况表明,您已经在作为程序运行的模块中定义了该类,因此该类不是* .py文件的名称,而是__main__的名称。当试图从Flask应用程序中释放它时,另一个模块是__main__模块,该模块不包含myclass类对象。

因此,最简单的修复方法是在创建 pickle 时使用其他模块作为程序。该模块必须从package1导入myclass或至少package1

10-07 19:15
查看更多