gpt4 book ai didi

python - 内置函数的 dill/pickle 问题

转载 作者:太空宇宙 更新时间:2023-11-03 15:56:22 29 4
gpt4 key购买 nike

使用dill序列化类时:

import dill, pickle

class project(object):
def __init__(self, name='', folder='', user_id='', version=-1 ):
self.name, self.folder, self.user_id, self.version = name, folder, user_id, version
# Other code, not shown, since Big class .......

dill.dump(proj1, open('test_dill.pkl', 'w'), byref=False )

我收到此消息:

PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_input


File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 236, in dump
pik.dump(obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 224, in dump
self.save(obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce
save(args)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple
save(element)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce
save(args)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple
save(element)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce
save(args)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple
save(element)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce
save(args)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple
save(element)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 606, in save_list
self._batch_appends(iter(obj))

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 642, in _batch_appends
save(tmp[0])

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce
save(state)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict
StockPickler.save_dict(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems
save(v)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self

File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 993, in save_builtin_method
StockPickler.save_global(pickler, obj)

File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 759, in save_global
(obj, module, name))

PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_input

不确定内置函数是否可以通过代码修改...
听起来很神秘。

最佳答案

我是 dill 作者。不同的设置(例如byref)用于修改转储中包含的对象类型。 pickledill 使用递归对象序列化,这意味着当一个对象引用另一个对象时,它可能(也可能不)根据序列化设置对其进行序列化。 pickle 通常通过引用序列化函数和类 (byref=True),这意味着它们仅在导入时按名称序列化。 dill 有多个设置,例如 byref=False (它序列化函数和类对象而不是通过引用)。还有recurse,它处理全局引用的序列化方式——recurse=False将所有全局变量序列化为字典,而recurse=True > 仅序列化全局变量中引用的项目以及这些项目引用的项目等等。

简而言之,无论您要序列化什么,都会有一些全局引用,这些引用会触发递归序列化,直到遇到 dill 无法 pickle 的内容。

您可以尝试以下一些操作:

  1. 将文件中的对象分成单独的文件 - 这使您可以更多地依赖通过引用进行 pickle 。
  2. 使用不同的设置(例如 recurse=True)来更改 dill 尝试与目标对象序列化的对象。您可以使用dill.settings全局设置设置。
  3. 向您的类添加序列化辅助方法,通知 pickle 如何序列化您的类。
  4. 重构您的类(不知何故,因为我看不到它的内容)以避免序列化问题。

很难更深入地回答,因为您还没有发布演示该错误的工作示例。

关于python - 内置函数的 dill/pickle 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731774/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com