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:
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:
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:
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 :
Citation:
AttributeError: 'NoneType' object has no attribute 'attribut'
Quelqu'un aurait une idee d'ou peu venir le probleme?...plz