Python标准库中的默认pickle模块不允许使用闭包,lambda或__main__中的函数对功能进行序列化(请参见here)。我需要使用一些自定义函数来腌制一个对象,这些函数在导入时不会被导入。还有其他一些Python对象序列化程序,包括dill和cloudpickle都可以做到这一点。cloudpickle documentation似乎在说,即使使用cloudpickle进行腌制,也可以使用标准的pickle模块进行腌制。这非常吸引人,因为我什至无法在需要解包的环境中安装软件包。实际上,文档中的示例基本上执行以下操作:泡菜:>>> import cloudpickle>>> squared = lambda x: x ** 2>>> pickled_lambda = cloudpickle.dump(squared, open('pickled_file', 'w'))解开:>>> import pickle>>> new_squared = pickle.load(open('pickled_file', 'rb'))>>> new_squared(2)但是,在未安装cloudpickle的环境中运行该第二个块(即使它从未被导入)也会产生错误:"ImportError: No module named cloudpickle.cloudpickle"可能最容易重现的示例是为Python2安装cloudpickle,运行第一个块,然后尝试使用Python3(未安装cloudpickle)在第二个块中加载腌制的文件。这里发生了什么?如果什至没有调用cloudpickle,为什么还要安装它才能运行标准pickle负载? 最佳答案 从理论上讲,cloudpickle不需要安装到load腌制对象上。从理论上讲,cloudpickle所要做的也将包括释放该对象中的对象必需的所有功能。但是,从理论上讲。在方法注册表中(例如使用copyreg),序列化程序将需要注册使序列化程序能够创建所需类型的新对象并将其置于保存状态的方法。为了不需要在加载时安装序列化程序,序列化程序将需要在腌制对象本身内包括所有必需的反序列化方法(这是可能的,因为腌制是递归的)。cloudpickle假定已安装cloudpickle,因此(为了使所得的腌制对象变小)不包括所有必需的方法。这与numpy不同,作为反例,dumps上的numpy.array方法的确在泡菜中包括了reconstruct方法(您可以看到,因为numpy.core.multiarray\n_reconstruct出现在)。关于python - 无需安装云签即可解开云签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35901559/ 10-10 12:37