2017-10-18 13 views
0

J'essaie de charger un pickle et d'afficher des données via une application Flask. La structure que je suis suit est la suivante.Flask Erreur d'attribut avec unpickling

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) 

A l'intérieur du fl askapp, j'obtiens une erreur comme:

AttributeError: Can't get attribute 'myclass' on <module '__main__' from <flask_path> 

Y at-il un moyen de résoudre ce problème? Quelqu'un peut-il expliquer pourquoi j'ai cette erreur?

Répondre

0

Afin de décoller, vous devez avoir le même module et la même structure de paquetages par rapport au moment où vous avez décapé l'objet. Votre exception suggère que vous avez défini la classe dans le module que vous avez exécuté en tant que programme, donc il n'a pas le nom du fichier * .py mais le nom __main__. Et lorsque vous tentez de le décomposer à partir de l'application Flask, un autre module est le module __main__, un module qui ne contient pas l'objet de classe myclass.

Donc, la solution la plus simple serait d'utiliser un autre module comme programme lorsque créant le pickle. Ce module doit importer package1 ou au moins myclass de package1.