如何挑选一个ssl.SSLContext对象(How to pickle a ssl.SSLContext object)

系统教程 行业动态 更新时间:2024-06-14 16:57:40
如何挑选一个ssl.SSLContext对象(How to pickle a ssl.SSLContext object)

在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).

更多推荐

本文发布于:2023-04-13 12:17:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/dzcp/24c57a106c68bcdf486ce7bd19d97306.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:对象   如何挑选   ssl   SSLContext   pickle

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!