pickle исчерпывается до конца кадра при использовании Dill с кодом, который отлично работает с Pickle

Я работаю над игровым проектом, который использует 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

Я не знаю, как даже начать диагностировать это. В чем дело?

РЕДАКТИРОВАТЬ:

Чтобы уточнить, ошибка возникает при десериализации.


person Schilcote    schedule 16.12.2015    source источник
comment
Как был сгенерирован файл save.sav, который вы используете в своем тесте? то есть он был сгенерирован с использованием pickle или dill?   -  person Sebastian    schedule 16.12.2015
comment
@Себастьян С dill.   -  person Schilcote    schedule 16.12.2015
comment
@Sebastian Чтобы уточнить, я всегда проверяю pickle на сгенерированном файле pickle и dill на сгенерированном файле dill. Я не пробовал их смешивать, но сомневаюсь, что получится что-то хорошее.   -  person Schilcote    schedule 16.12.2015
comment
^ 1, потому что это название   -  person brandonscript    schedule 16.12.2015
comment
Я почти уверен, что это прямая ошибка в Dill. @Майк МакКернс?   -  person Schilcote    schedule 17.12.2015
comment
Я не могу сказать, что вы делаете из трассировки. Возможно, вы захотите (1) включить dill.detect.trace(True), чтобы увидеть, что (и как) сериализуется, или (2) попробовать сериализовать все, что вызывает проблемы с dill.settings['byref'] = True (или для каждого объекта с ключевым словом byref в dumps).   -  person Mike McKerns    schedule 17.12.2015
comment
@MikeMcKerns Один из них показал мне, что я пытался замариновать некоторые непригодные для обработки объекты, которые я исправил, но теперь у меня еще более странные проблемы. В игре есть объект симулятора REPL, основанный на объектах в code, и иногда, когда он сериализуется, результирующий файл вызывает ту же ошибку exaughsted before end of frame, что и раньше. Что действительно странно, так это то, что это зависит от того, что было введено в консоль; Это не работает каждый раз, но foo каждый раз вызывает сбой. Есть ли какие-либо другие параметры отладки в Dill, которые я могу включить?   -  person Schilcote    schedule 18.12.2015
comment
dill имеет альтернативные параметры сериализации в dill.settings и позволяет вам изменить глобальную сериализацию объектов путем изменения настроек… или изменить per-dump как ключевое слово в dump. Для отладки я использую trace, как было предложено выше, однако в dill.detect есть и другие функции для отладки, а также pickletools.dis, доступные в стандартной библиотеке. Для отладки я обычно использую dill.detect.trace и pickletools.dis.   -  person Mike McKerns    schedule 20.12.2015
comment
См.: stackoverflow.com/a/32206955/2379433.   -  person Mike McKerns    schedule 20.12.2015
comment
Кроме того, если вы проверяете травление в Windows по сравнению с системами, отличными от Windows, или между процессами и между компьютерами, отметьте dill.pickles и dill.check.   -  person Mike McKerns    schedule 20.12.2015


Ответы (1)


Может быть, вы используете (или использовали) CPython 3.4? Если да, то существовала ошибка, которая должен быть уже исправлен.

У меня также была эта проблема, но не на моем компьютере, на котором установлен Python 3.4.4, а на Github Travis, который использует 3.4.2.

person Peque    schedule 15.03.2016
comment
Я действительно был! 3.5 по-прежнему не работает на моей машине, но я попробую установить ее еще раз и посмотрю, решит ли это проблему. - person Schilcote; 15.03.2016