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.
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
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)
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 #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>
Par ailleurs, si j'essaye d'acceder a "attribut", l'exception AttibuteError de declanhe :
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
AttributeError: 'NoneType' object has no attribute 'attribut'
Quelqu'un aurait une idee d'ou peu venir le probleme?...plz
Partager