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()
这样的事情应该起作用:
>>> 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
>>>
基本上,aSSLContext
需要a
protocol
,并且由于任何原因,实例被腌制时protocol
都不会保存(例如,不在__reduce__
方法中)。如果您需要更多的状态(即其他args
并kwds
从__init__
方法),那么你就需要从扩展的返回值save_sslcontext
上述功能。(请注意,如果您使用的是python
2.x,则相应的模块为copy_reg
)。
问题内容: 我的代码(我无法使用’pickle’): 打印: 谁能告诉我如何使用。 问题答案: 你想做什么?这个对我有用: 所以这将打印: 如果需要setstate: 打印:
问题内容: 我正在学习如何使用泡菜。我创建了一个namedtuple对象,并将其附加到列表中,并尝试使该列表腌制。但是,出现以下错误: 我发现,如果我运行代码时没有将其包装在函数中,那么它可以完美地工作。当包装在函数中时,是否需要额外的步骤来腌制对象? 这是我的代码: 问题答案: 在函数 外部 创建命名元组: 现在可以找到它;现在是全局模块。拆线时,所有要做的就是重新定位。在您的版本,是一个 地方
问题内容: 我有一个defaultdict看起来像这样: 问题是,我不能使用cPickle腌制它。我在这里找到的解决方案之一是使用模块级函数而不是lambda。我的问题是,什么是模块级功能?如何在cPickle中使用字典? 问题答案: 除了Martijn的解释之外: 模块级函数是在模块级定义的函数,这意味着它不是类的实例方法,它不嵌套在另一个函数中,并且它是带有名称的“真实”函数,而不是lambd
问题内容: 作为此问题的后续措施: 是否有一种简单的方法来腌制python函数(或以其他方式序列化其代码)? 我想从上面的帖子中看到此项目符号的示例: “如果函数引用需要拾取的全局变量(包括导入的模块,其他函数等),则也需要对它们进行序列化,或在远程端重新创建它们。我的示例只是为它提供了远程进程的全局命名空间。 ” 我有一个简单的测试,可以使用marshal将功能字节代码写入文件: 然后启动一个新
下面链接的文档似乎表明可以对顶级类及其实例进行pickle处理。但根据我对前一个问题的回答来看,这似乎不正确。在我发布的脚本中,pickle接受类对象并写入文件,但这没有用。 这是我的问题:这个文档是错误的,还是有更微妙的东西我不明白?另外,在这种情况下,泡菜是否应该生成某种错误消息? https://docs . python . org/2/library/pickle . html # wh
问题内容: 最近,有人提出了一些Python代码试图通过使用腌制过程促进分布式计算的问题。显然,该功能在历史上是可能的,但是出于安全原因,该功能被禁用。第二次尝试通过套接字传输功能对象时,仅传输了引用。如果我错了,请纠正我,但我不认为此问题与Python的后期绑定有关。假定不能腌制进程和线程对象,是否有任何方法可以传输可调用对象?我们希望避免为每个作业传输压缩的源代码,因为这可能会使整个尝试变得毫