添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
if hasattr(obj, "__dict__"): for k, v in obj.__dict__.items(): result = pickle_trick(v, max_depth=max_depth - 1) if result: failing_children.append(result) output = { "fail": obj, "err": e, "depth": max_depth, "failing_children": failing_children return output if __name__ == "__main__": r = redis.Redis() print(pf(pickle_trick(r)))

另外附上说明:

What can be pickled and unpickled?

The following types can be pickled:

  • None, True, and False

  • integers, floating point numbers, complex numbers

  • strings, bytes, bytearrays

  • tuples, lists, sets, and dictionaries containing only picklable objects

  • functions defined at the top level of a module (using def, not lambda)

  • built-in functions defined at the top level of a module

  • classes that are defined at the top level of a module

  • instances of such classes whose __dict__ or the result of calling __getstate__() is picklable (see section Pickling Class Instances for details).

As you can see, modules are not part of this list. Note, that this is also true when using deepcopy and not only for the pickle module, as stated in the documentation of deepcopy :

This module does not copy types like module, method, stack trace, stack frame, file, socket, window, array, or any similar types. It does “copy” functions and classes (shallow and deeply), by returning the original object unchanged; this is compatible with the way these are treated by the pickle module.

A possible workaround is using the @property decorator instead of an attribute. For example, this should work:

    import numpy as np
    import pickle
    class Foo():
        @property
        def module(self):
            return np
    foo = Foo()
    with open('test.out', 'wb') as f:
        pickle.dump(foo, f)

参考资料:

Python: can't pickle module objects error - Stack Overflow 

Traceback (most recent call last): File "/nfs/volume-902-6/xxxx/bad_test.py", line 66, in generate_pre_annot pickle.dump(proposals, f, protocol=None, fix_imports=True) TypeError: can't pickle module objects 又一次阴沟里翻船,还好同事帮忙指出来的 你这个pickle啊,它保存的东西需 Traceback (most recent call last): File “D:/flaskProject/test.py”, line 35, in test pool.apply(self.out, args=(i,)) File “Python37-32\lib\multiprocessing\pool.py”, line 261, in apply return self.apply_async(func, args, kwds).get() File “\lib\multiprocessing\pool.py”, line 657, in get raise se 根源出在copy.deepcopy(self)函数上,其在序列化操作时面对_thread.lock会无法序列化。其中循环中注释掉的那一行是原代码,做了一个简单的判断,对于_thread.lock和lock的不做操作,绕过去。所谓浅层解决办法,就是顾头不顾腚,绕过去再说,不是终极解决办法,不过有用咱就先用着。这显然不是去根的办法,不过应应急还是可以的。等我回头有时间了,看看有没有根治的办法吧。函数: _get_spider_loader。 运行一下以前的一个Vue+webpack的 vue仿新闻网站  小项目,报错 由于自己vue学习不深入,老是这个报错,找了好久(确切的说是整整一下午^…^)才找到原因 -v- Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>' 点开错误的文件,标注错误的地方是这样的一段代码: import {normalTime} from './timeFormat'; module.exports={   normalTime 就是module.exports 本文研究的主要是Python使用pickle模块存储数据报错解决方法,以代码的形式展示,具体如下。 首先来了解下pickle模块 pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。 pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化, pickle序列化后的数据,可读性差,人一般无法识别。 接下来我们看下Python使用pickle模块存储数据报错解决方法。 # 写入错误 TypeError: write() argument must be str, not byte 使用copy模块中的deepcopy方法深度克隆某一个对象,如果方法使用不当那么就会出现各种各样的问题,例如can't pickle module objects error 这个问题主要是出在了在multiprocessing中,开新的process的时候有对象是一个 _io.TextIOWrapper,而这个类很大可能是你打开了一个文件并将其赋值给了一个变量同时该文件没有关上,那么这个变量就是一个 _io.TextIOWrapper 对象,且这个对象在multiprocessing中是不能被序列化的。解决方式是将变量 _io.TextIOWrapper 在 开新的process的时候关掉或者不共享。......... Traceback (most recent call last): File "D:/master/Multi-level-DCNet-master/3leveldcnet.py", line 342, in <module> routings=args.routings) File "D:/master/Multi-level-DCNet-master/3leveldcnet.py", line 60, in MultiLevelDCNet conv, nb_fil... 我错误的原因是因为第一个报错已经指明了:python不能pickle tkinter object, 导致了整个错误。就好了,另外也要注意在win中运行python多进程程序时要加上。 Python错误解读:无法pickle本地对象’CDLL.当您在使用Python编写代码时,有时候会遇到一些奇怪的错误信息。在这篇文章中,我们将探讨一个常见的错误:“Can’t pickle local object ‘CDLL..._FuncPtr’”以及如何解决它。 调试websocket对象用协程,线程都无法两者都运行,因此使用多线程,多线程也有报错 TypeError: cannot pickle ‘_thread.lock’ object。可以在ws_utils对象中创建全局变量redis,而不直接传redis对象,而传redis配置(或者直接从配置文件读取)部分。根据晚上查找资料说是在开启进程,会将信息序列化后传递到子进程,报错就是在信息进行序列化时候。猜测是上面ws_utils对象进行序列化问题,比较容易猜测,redis对象序列化存在问题。