9

我有一个要腌制的带有 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

我该如何坚持这一点?

我能想到的唯一解决方案是将 FileCookieJar.save 和 FileCookieJar.load 用于 stringIO 对象。但是有更好的方法吗?

4

2 回答 2

9

这是一个尝试,通过从 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-21T05:01:30.360 回答
7

CookieJar不是特别为持久化而设计的(这就是FileCookieJar子类的主要内容!-),但是您可以遍历一个CookieJar实例以获取所有 cookie(并持久化这些 cookie 的列表,例如),并重建给定的 jar cookie,set_cookie在每个上使用。这就是我将如何设置持久化和非持久化 cookie 罐,copy_reg如果我需要经常使用它们,使用该方法注册适当的函数。

于 2009-06-21T04:56:19.820 回答