所谓浅层解决办法,就是顾头不顾腚,绕过去再说,不是终极解决办法,不过有用咱就先用着。
我这是在使用scrapy爬虫的时候碰到的,发生的莫名其妙,前些天启动scrapy都好好的,突然就出毛病了,错误就是TypeError: cannot pickle '_thread.lock' object,熟悉python的都知道,pickle是python的一种序列化解决方案,但是在进入scrapy\crawler.py启动爬虫,读取配置的时候出错:
函数: _get_spider_loader
return loader_cls.from_settings(settings.frozencopy())
根源出在copy.deepcopy(self)函数上,其在序列化操作时面对_thread.lock会无法序列化。
所以我简单修改了python\copy.py这个文件:
def _deepcopy_dict(x, memo, deepcopy=deepcopy):
y = {}
memo[id(x)] = y
from icecream import ic
for key, value in x.items():
# y[deepcopy(key, memo)] = deepcopy(value, memo)
if key not in ['_fork_lock', '_lock']:
y[deepcopy(key, memo)] = deepcopy(value, memo)
return y
其中循环中注释掉的那一行是原代码,做了一个简单的判断,对于_thread.lock和lock的不做操作,绕过去。
这显然不是去根的办法,不过应应急还是可以的。等我回头有时间了,看看有没有根治的办法吧