在Windows上使用Python 3.5,试试这些:
import ssl, pickle, multiprocessing context = ssl.create_default_context() foo = pickle.dumps(context) pickle.loads(foo)抛出异常:
TypeError: __new__() missing 1 required positional argument: 'protocol'multiprocessing.Process的子类抛出相同的异常:
class Foo(multiprocessing.Process): def __init__(self): super().__init__() self.context = ssl.create_default_context() def run(self): pass if __name__ == '__main__': foo = Foo() foo.start()Python 3.5 on windows, try these:
import ssl, pickle, multiprocessing context = ssl.create_default_context() foo = pickle.dumps(context) pickle.loads(foo)Throws an exception:
TypeError: __new__() missing 1 required positional argument: 'protocol'subclass of multiprocessing.Process throws the same exception:
class Foo(multiprocessing.Process): def __init__(self): super().__init__() self.context = ssl.create_default_context() def run(self): pass if __name__ == '__main__': foo = Foo() foo.start()最满意答案
像这样的东西应该工作:
>>> import pickle, copyreg, ssl >>> >>> def save_sslcontext(obj): ... return obj.__class__, (obj.protocol,) ... >>> copyreg.pickle(ssl.SSLContext, save_sslcontext) >>> >>> context = ssl.create_default_context() >>> foo = pickle.dumps(context) >>> _foo = pickle.loads(foo) >>> _foo <ssl.SSLContext object at 0x1011812a8> >>> _foo.protocol 2 >>>基本上, SSLContext需要一个protocol ,并且无论出于何种原因,当实例被pickle时, protocol不会被保存(例如,它不在__reduce__方法中)。 如果你需要更多的状态(即__init__方法中的其他args和kwds ),那么你需要从上面的save_sslcontext函数扩展返回值。 (注意,如果你在python 2.x中,那么相应的模块是copy_reg )。
Something like this should work:
>>> import pickle, copyreg, ssl >>> >>> def save_sslcontext(obj): ... return obj.__class__, (obj.protocol,) ... >>> copyreg.pickle(ssl.SSLContext, save_sslcontext) >>> >>> context = ssl.create_default_context() >>> foo = pickle.dumps(context) >>> _foo = pickle.loads(foo) >>> _foo <ssl.SSLContext object at 0x1011812a8> >>> _foo.protocol 2 >>>Basically, a SSLContext needs a protocol, and for whatever reason, the protocol is not saved (e.g. it's not in a __reduce__ method) when the instance is pickled. If you need more state (i.e. other args and kwds from the __init__ method), then you'll need to extend the return value from the save_sslcontext function above. (Note, if you are in python 2.x, then the appropriate module is copy_reg).
更多推荐
发布评论