Ich versuche mit dem Shelve-Python-Modul meine Session-Ausgabe zu speichern und später neu zu laden, aber ich habe festgestellt, dass wenn ich Funktionen definiert habe, bekomme ich einen Fehler in der Nachladephase. Gibt es ein Problem mit der Art, wie ich es mache? Ich habe meinen Code auf eine Antwort unter How can I save all the variables in the current python session? basiert.Speichern von Funktionen mit Shelve
Hier ist ein einfacher Code, der den Fehler reproduziert:
def test_fn(): #simple test function
return
import shelve
my_shelf = shelve.open('test_shelve','n')
for key in globals().keys():
try:
my_shelf[key] = globals()[key]
except: #__builtins__, my_shelf, and imported modules cannot be shelved.
pass
my_shelf.close()
Dann kann ich
ls -lh test_shelve*
-rw-r--r-- 1 user group 22K Aug 24 11:16 test_shelve.bak
-rw-r--r-- 1 user group 476K Aug 24 11:16 test_shelve.dat
-rw-r--r-- 1 user group 22K Aug 24 11:16 test_shelve.dir
Im Allgemeinen tun, wenn ich verlassen, in einer neuen IPython Sitzung, die ich etwas in der Lage sein zu tun wie:
import shelve
my_shelf = shelve.open('test_shelve')
for key in my_shelf:
globals()[key]=my_shelf[key]
Dies erzeugt einen Fehler für den Schlüssel 'test_fn'. Hier ist ein Code, den Fehler zu demonstrieren:
print my_shelf['test_fn']
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-deb481380237> in <module>()
----> 1 print my_shelf['test_fn']
/home/user/anaconda2/envs/main/lib/python2.7/shelve.pyc in __getitem__(self, key)
120 except KeyError:
121 f = StringIO(self.dict[key])
--> 122 value = Unpickler(f).load()
123 if self.writeback:
124 self.cache[key] = value
AttributeError: 'module' object has no attribute 'test_fn'
Natürlich ist eine Lösung wäre, Funktionen in der Sparphase ausschließen, sondern von dem, was ich gelesen habe, soll es möglich sein, sie mit dieser Methode zu restaurieren und so Ich habe mich gefragt, ob ich etwas falsch mache.
OK danke. Testet, ob das Objekt, das ich meinem my_shelf hinzufügen möchte, eine Funktion beim Speichern ist, und nur wenn es nicht hinzugefügt wird, ein guter Weg, um das Problem zu lösen? Gibt es andere Objekttypen, die Probleme verursachen könnten? – PeterW
@ user3798292: Sehen Sie sich die ['pickle' Dokumentation] (https://docs.python.org/2/library/pickle.html#what-can-be-pickled-und-unpickled) an, was kann und kann ' t eingelegt werden. Ich habe diese Referenz in meine Antwort aufgenommen. –
@ user3798292: anstatt alles * in Ihrem Modul * zu vertonen, warum legen Sie nicht explizit alles beiseite, was für Ihr Problem von Bedeutung ist? Explizit ist hier besser als implizit. –