Я пытаюсь использовать модуль shelve python для сохранения вывода сессии и перезагрузки позже, но я обнаружил, что если у меня есть определенные функции, то я получаю ошибку на этапе перезагрузки. Есть ли проблема с тем, как я это делаю? Я основывал свой код на ответе на How can I save all the variables in the current python session?.Сохранение функций с помощью полки
Вот некоторые простой код, который воспроизводит ошибку:
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()
Тогда, если я выхожу я могу сделать
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
В общем, в новой сессии IPython я хочу, чтобы иметь возможность сделать что-то например:
import shelve
my_shelf = shelve.open('test_shelve')
for key in my_shelf:
globals()[key]=my_shelf[key]
Это вызывает ошибку при использовании ключа 'test_fn'. Вот код, чтобы показать сообщение об ошибке:
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'
Конечно, одно решение было бы исключить функции в стадии экономии, но от того, что я прочитал это должно быть возможно восстановить их с помощью этого метода, и поэтому Я задавался вопросом, не ошибаюсь ли я.
OK спасибо. Является ли проверка того, является ли объект, который я пытаюсь добавить в my_shelf, является функцией при сохранении и только добавление, если это не так, хороший способ решить проблему? Существуют ли другие типы объектов, которые могут вызвать проблемы? – PeterW
@ user3798292: см. Документацию ['pickle'] (https://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled) относительно того, что может и может ' t быть маринованным. Я включил эту ссылку в свой ответ. –
@ user3798292: вместо того, чтобы пытаться и откладывать * все * в вашем модуле, почему бы не явно отложить все, что действительно важно для вашей проблемы? Явное здесь лучше, чем неявное. –