我正在尝试加载 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
。