Я работаю над игровым проектом, который использует Pickle для реализации сохраненных игр (я знаю недостатки этого - давайте не будем обсуждать это здесь). Это отлично работает: к сожалению, стандартный Pickle не может справиться с некоторыми вещами, которые я хочу сделать в будущих версиях, поэтому вместо этого я перехожу на Dill. К сожалению, это не работает: выдает _pickle.UnpicklingError: pickle exhausted before end of frame
всякий раз, когда загружает сохранение.
Повторюсь: этот код и тестовые примеры, которые я использую, отлично работают с Pickle. У него проблемы только с Диллом.
Я импортирую укроп следующим образом:
try:
import dill as pickle
except ImportError:
print("Failed to load Dill serialization library: some features may not work correctly.")
import pickle
И полная трассировка выглядит так:
Traceback (most recent call last):
File "C:/Users/Schilcote/workspace/pyweek19/main.py", line 605, in game_init
gamestate=pickle.load(open(os.path.join(_savedir,"save.sav"),"rb"))
File "C:\Python34\lib\site-packages\dill\dill.py", line 199, in load
obj = pik.load()
File "C:\Python34\Lib\pickle.py", line 1036, in load
dispatch[key[0]](self)
File "C:\Python34\Lib\pickle.py", line 1321, in load_global
module = self.readline()[:-1].decode("utf-8")
File "C:\Python34\Lib\pickle.py", line 247, in readline
"pickle exhausted before end of frame")
_pickle.UnpicklingError: pickle exhausted before end of frame
Я не знаю, как даже начать диагностировать это. В чем дело?
РЕДАКТИРОВАТЬ:
Чтобы уточнить, ошибка возникает при десериализации.
save.sav
, который вы используете в своем тесте? то есть он был сгенерирован с использованиемpickle
илиdill
? - person Sebastian   schedule 16.12.2015dill
. - person Schilcote   schedule 16.12.2015pickle
на сгенерированном файлеpickle
иdill
на сгенерированном файлеdill
. Я не пробовал их смешивать, но сомневаюсь, что получится что-то хорошее. - person Schilcote   schedule 16.12.2015dill.detect.trace(True)
, чтобы увидеть, что (и как) сериализуется, или (2) попробовать сериализовать все, что вызывает проблемы сdill.settings['byref'] = True
(или для каждого объекта с ключевым словомbyref
вdumps
). - person Mike McKerns   schedule 17.12.2015code
, и иногда, когда он сериализуется, результирующий файл вызывает ту же ошибку exaughsted before end of frame, что и раньше. Что действительно странно, так это то, что это зависит от того, что было введено в консоль; Это не работает каждый раз, но foo каждый раз вызывает сбой. Есть ли какие-либо другие параметры отладки в Dill, которые я могу включить? - person Schilcote   schedule 18.12.2015dill
имеет альтернативные параметры сериализации вdill.settings
и позволяет вам изменить глобальную сериализацию объектов путем изменения настроек… или изменить per-dump
как ключевое слово вdump
. Для отладки я используюtrace
, как было предложено выше, однако вdill.detect
есть и другие функции для отладки, а такжеpickletools.dis
, доступные в стандартной библиотеке. Для отладки я обычно используюdill.detect.trace
иpickletools.dis
. - person Mike McKerns   schedule 20.12.2015dill.pickles
иdill.check
. - person Mike McKerns   schedule 20.12.2015