我有一个带有CookieJar的对象,我想要对其进行泡菜处理。
但是,正如您可能都知道的那样,pickle会在包含锁对象的对象上阻塞。出于某种可怕的原因,CookieJar有一个锁对象。
from cPickle import dumps
from cookielib import CookieJar
class Person(object):
def __init__(self, name):
self.name = name
self.cookies = CookieJar()
bob = Person("bob")
dumps(bob)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# cPickle.UnpickleableError: Cannot pickle <type 'thread.lock'> objects我该如何坚持下去呢?
我能想到的唯一解决方案是对stringIO对象使用FileCookieJar.save和FileCookieJar.load。但是有没有更好的方法呢?
发布于 2009-06-21 05:01:30
这是一个尝试,通过从CookieJar派生一个类,它覆盖了pickle使用的getstate/setstate。我还没有使用过cookieJar,所以不知道它是否可用,但您可以转储派生类
from cPickle import dumps
from cookielib import CookieJar
import threading
class MyCookieJar(CookieJar):
def __getstate__(self):
state = self.__dict__.copy()
del state['_cookies_lock']
return state
def __setstate__(self, state):
self.__dict__ = state
self._cookies_lock = threading.RLock()
class Person(object):
def __init__(self, name):
self.name = name
self.cookies = MyCookieJar()
bob = Person("bob")
print dumps(bob)发布于 2009-06-21 04:56:20
CookieJar对于持久化的设计并不是特别好(这正是FileCookieJar子类的主要用途!-),但是您可以遍历CookieJar实例以获取所有cookies (例如,持久化这些cookies的列表),并且,要在给定cookies的情况下重新构建jar,请在每个cookies上使用set_cookie。这就是我开始持久化和取消持久化cookie jars的方法,如果我需要经常使用它们,可以使用copy_reg方法来注册适当的函数。
https://stackoverflow.com/questions/1023224
复制相似问题