Problem mit Pickle: AttributeError: 'FakeModule' has no attr

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nablahero
User
Beiträge: 2
Registriert: Freitag 27. April 2012, 19:33

Hallo liebe Python-Gemeinde,

Ich hab da ein Problem mit dem pickle Modul. Ich erklär euch mal kurz grob woran ich arbeite, damit ihr den Sachverhalt versteht was ich mache: Ich versuche gerade Python-Prozesse zu parallelisieren. Dafür möchte ich gerne bestimmte Objekte in eine Queue stecken, die dann von "Workern" ausgeführt werden sollen. Soweit so gut.
Nun hab ich eine Klasse die "semMat" heißt, und mehrere Funktionen besitzt(mathematisches Zeug, unwichtig). Ich möchte diese Klasse nun aber per pickle.dumps() picklen, und die dann in "gepickled" in die Queue schieben(denn so verlangt es diese Queue ja), und die dann nach dem rausholen aus der Queue wieder laden(mittels pickle.loads()). Nun hab ich das Problem das ich beim laden diesen Error bekomme:

Code: Alles auswählen

AttributeError                            Traceback (most recent call last)

/home/walter_cits/workspace/sage/<ipython console> in <module>()

/opt/software/sage-4.8/local/lib/python2.6/site-packages/sage/misc/preparser.pyc in load(filename, globals, attach)
   1645         else:
   1646             # Preparse in memory only for speed.
-> 1647             exec(preparse_file(open(fpath).read()) + "\n", globals)
   1648     elif fpath.endswith('.spyx') or fpath.endswith('.pyx'):
   1649         import interpreter

/home/walter_cits/workspace/sage/<string> in <module>()

/opt/software/sage-4.8/local/lib/python/pickle.pyc in loads(str)
   1372 def loads(str):
   1373     file = StringIO(str)
-> 1374     return Unpickler(file).load()
   1375 
   1376 # Doctest

/opt/software/sage-4.8/local/lib/python/pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

/opt/software/sage-4.8/local/lib/python/pickle.pyc in load_inst(self)
   1067         module = self.readline()[:-1]
   1068         name = self.readline()[:-1]
-> 1069         klass = self.find_class(module, name)
   1070         self._instantiate(klass, self.marker())
   1071     dispatch[INST] = load_inst

/opt/software/sage-4.8/local/lib/python/pickle.pyc in find_class(self, module, name)
   1124         __import__(module)
   1125         mod = sys.modules[module]
-> 1126         klass = getattr(mod, name)
   1127         return klass
   1128 

AttributeError: 'FakeModule' object has no attribute 'semMat'
Ich weiß nun nicht was davon euch vielleicht was sagt, deswegen hab ich euch alles kopiert. Könnt ihr mir irgendwie weiterhelfen?

Beste Grüße

nablahero
BlackJack

@nablahero: Wo hast Du die Klasse denn definiert? Laut Traceback in einem Modul mit dem Namen `FakeModule`, was an sich mal nicht besonders vertrauenserweckend klingt. Die Klasse muss in einem Modul stecken, was zur Laufzeit beim „entpicklen” gefunden und geladen werden kann, und dann die Klasse unter dem Namen enthält.
nablahero
User
Beiträge: 2
Registriert: Freitag 27. April 2012, 19:33

Ich glaub Ich weiß woran es hapert.. im "normalen" python funktionierts einwandfrei, ich jedoch benutze sage ( http://www.sagemath.org ). Das basiert zwar auf python, und hat auch eine aktuelle Version implementiert, aber irgendwie scheint zumindest pickle sich anders zu verhalten als unter python.

Um deine Frage zu beantworten: Mein File sieht so aus: (beispielhaft)

Code: Alles auswählen

import pickle

class semMat():
	
	def randomize(self, int_zahl):
		return int_zahl * int_zahl 
		
		
test = semMat()
pickled = pickle.dumps(test)
print pickled
unpickled = pickle.loads(pickled)
print unpickled
sage wirft mir genau bei loads den Fehler aus, python hingegen nicht, also scheint das wohl ein sage-Problem zu sein. Hätte trotzdem vielleicht jemand einen Lösungsansatz?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Auf stackoverflow.com gibt es mehr als genug Hinweise darauf, dass FakeModule eine Eigenheit von IPython ist, welche fürs unpicklen berücksichtigt werden muss.
Antworten