IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Deserialization avec pickle


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Par défaut Deserialization avec pickle
    Bonjour,
    j'essaye tant bien que mal de deserialiser une instance d'object (pattern singleton) à l'aide de pickle.
    le probleme est le suivant :
    Si je serialize puis deserialize mon instance dans un meme script py, tout se passe bien, cependant, si je fais la serialization et la deserialization a l'aide de deux scripts distincts.. je ne recupere pas l'instance creer lors de la serialization.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #Object a pickler/depickler
    class Workers:  
        #Singleton
        instance = None
     
        class __Impl:
     
            def __init__(self):
                self.attribut = "test"
     
        def __init__(self):
     
            if not Workers.instance:
                Workers.instance = Workers.__Impl()  
     
        def __getattr__(self, attr):
            """ Delegate access to implementation """
            return getattr(self.instance, attr)
     
        def __setattr__(self, attr, value):
            """ Delegate access to implementation """
            return setattr(self.instance, attr, value)
    Dans le code suivant, on retrouve bien l'instance apres deserialization (stdout)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #test.py
    import pickle
    Serial = Workers()
    fd = open("worker.xxx", 'w')
    pickle.dump(Serial, fd, pickle.HIGHEST_PROTOCOL)
    fd.close()
     
    fd = open("worker.xxx", "r")
    Deserial = pickle.load(fd)
    fd.close()
    print Deserial
    >> stdout :: <Workers.Workers instance at 0x01E88800>
    Alors que si je fais ca en deux temps (lancer test1.py puis test2.py), je recupere None (stdout) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #test1.py
    import pickle
    Serial = Workers()
    fd = open("worker.xxx", 'w')
    pickle.dump(Serial, fd, pickle.HIGHEST_PROTOCOL)
    fd.close()
     
    #test2.py
    import pickle
    fd = open("worker.xxx", "r")
    deserial = pickle.load(fd)
    fd.close()
    print deserial
    >> stdout :: None
    Par ailleurs, si j'essaye d'acceder a "attribut", l'exception AttibuteError de declanhe :
    AttributeError: 'NoneType' object has no attribute 'attribut'

    Quelqu'un aurait une idee d'ou peu venir le probleme?...plz

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    Ta classe Worker est-elle bien importée dans ton script test2.py?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Par défaut
    Bonjour,

    Ta classe Worker est-elle bien importée dans ton script test2.py?
    __________________
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.
    Heuuu, maybe un manque d'experience... mais je ne vois pas pourquoi je devrais importer Workers dans test2.py ...! (Serait-ce histoire de "caster" l'object deserialisé ???)
    Sinon il est en effet bien importé dans autant test.py que test1.py.

  4. #4
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Effectivement, la serialisation ne conserve pas la définition de ta classe, tu es donc obligé de l'importer pour la deserialiser.

    Extrait de la doc:
    Similarly, when class instances are pickled, their class's code and data are not pickled along with them. Only the instance data are pickled.
    Et comme tu utilises des attributs de classe, je ne sais pas si cela va fonctionner ..

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Par défaut
    :\ j'ai importé ma classe dans test2.py mais :\ rien n'a changé...
    par contre, j'arrive toujours pas a comprendre pourquoi tout marche bien si on realise ca dans un meme fichier py versus dans deux distincts (serialization//deserialization)... dure dure !!!

  6. #6
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    essaie avec le nouveau modèle de classe (enfin qui date maintenant )
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Workers(object): 
       ...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Par défaut
    Chui en python 2.4 (ca compte ??)...
    je viens de tenter le coup (class Workers(object) mais meme resultat :\

    Sinon, le fond du probleme, c'est que j'ai mon appli. qui à travers ma classe Workers demarre plusieurs Threads.
    En parallele mon appli. demarre un autre thread (qui lui meme lance un subprocess grace a os.system(python.exe any.py) dans sa methode 'run')

    Ensuite, pendant l'execution de any.py, je cherche (dans any.py) a acceder à l'un des threads lancé par mon appli. en lui passant deux objets dans une queue...

    => Problème, et comme illustré à travers mes precedents posts, je n'arrive pas a recuperer l'instance Workers via deserialization (ca doit surement etre une mauvaise methode...)

    !!! et le fait (possible solution) de lancer mes threads a travers any.py et non pas l'appli. principale, ne marche pas :\ en effet, l'__init__ pour chaque tache est lancé mais le start() n'est pas invoqué... et la aussi mistère :\ (enfin je soupçonne une histoire de priorité ou tout simplement le fait que any.py soit lancé dans un subprocess ne permet pas de faire des calls vers les start() de chaque Thread ou tout simplement y ont jamais la main...

    ++ S'il y a un moyen de recuperer l'instance de Workers grace à son adresse en memoire ... une doc m'interesserait bien...

    Enfin un casse-tete et un conseil serait plus que bienvenue...

  8. #8
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Ca ne viendrait pas de la définition de classe Worker ?
    sans les fonctions __getattr__(self, attr) et __setattr__(self, attr, value), y'a pas de souci

Discussions similaires

  1. Erreur avec pickle
    Par plumdoizo dans le forum Général Python
    Réponses: 16
    Dernier message: 07/02/2013, 21h06
  2. RunTimeError avec pickle.dump
    Par dark0502 dans le forum Général Python
    Réponses: 2
    Dernier message: 21/05/2011, 23h02
  3. probleme deserialization avec un autre exe
    Par jokary64 dans le forum C#
    Réponses: 0
    Dernier message: 31/05/2010, 16h29
  4. Un problème avec pickle
    Par rambc dans le forum Général Python
    Réponses: 2
    Dernier message: 15/11/2009, 11h56
  5. Deserialization avec type de classe dans attribut
    Par GroovyBaby dans le forum C#
    Réponses: 1
    Dernier message: 19/11/2008, 13h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo