Pickler类用于扩展标准pickle.Pickler的功能
项目描述
cloudpickle
cloudpickle
允许序列化 Python 标准库中默认 pickle
模块不支持序列化的 Python 构造。
cloudpickle
特别适用于 集群计算,其中 Python 代码通过网络传输到远程主机执行,可能在数据附近。
在许多其他方面,cloudpickle
支持序列化 lambda 函数 以及在 __main__
模块中(例如在脚本、shell 或 Jupyter 笔记本中)交互式定义的 函数和类。
Cloudpickle 只能用于在 完全相同的 Python 版本 之间发送对象。
使用 cloudpickle
进行 长期对象存储不受支持,并强烈反对。
安全提示:应该只从可信来源加载 pickle 数据,因为否则 pickle.load
可能会导致任意代码执行,从而导致严重的安全漏洞。
安装
最新版本的 cloudpickle
可从 pypi 获取
pip install cloudpickle
示例
序列化 lambda 表达式
>>> import cloudpickle
>>> squared = lambda x: x ** 2
>>> pickled_lambda = cloudpickle.dumps(squared)
>>> import pickle
>>> new_squared = pickle.loads(pickled_lambda)
>>> new_squared(2)
4
序列化在 Python shell 会话中交互式定义的函数(在 __main__
模块中)
>>> CONSTANT = 42
>>> def my_function(data: int) -> int:
... return data + CONSTANT
...
>>> pickled_function = cloudpickle.dumps(my_function)
>>> depickled_function = pickle.loads(pickled_function)
>>> depickled_function
<function __main__.my_function(data:int) -> int>
>>> depickled_function(43)
85
重写 pickle 的序列化机制以导入可构建结构
cloudpickle
和 pickle
之间的一个重要区别是,cloudpickle
可以通过 值 序列化函数或类,而 pickle
只能通过 引用 序列化它。通过引用序列化将函数和类视为模块的属性,并通过触发模块在加载时导入的指令进行打包。因此,通过引用序列化在限制方面有限,它假设包含函数或类的模块在反序列化环境中可用/可导入。当序列化在交互会话中定义的构造时,这个假设会破裂,这种情况会被 cloudpickle
自动检测,并以 值 的方式对这些构造进行序列化。
另一个预期假设会破裂的情况是在分布式执行环境中开发模块时:工作进程可能无法访问该模块,例如,如果它们位于开发模块的进程所在的不同机器上。本身,cloudpickle
无法检测此类“本地可导入”的模块并切换到值序列化;相反,它依赖于其默认模式,即通过引用序列化。然而,从 cloudpickle 2.0.0
开始,可以通过使用 register_pickle_by_value(module)
//unregister_pickle_by_value(module)
API 显式指定应使用值序列化的模块
>>> import cloudpickle
>>> import my_module
>>> cloudpickle.register_pickle_by_value(my_module)
>>> cloudpickle.dumps(my_module.my_function) # my_function is pickled by value
>>> cloudpickle.unregister_pickle_by_value(my_module)
>>> cloudpickle.dumps(my_module.my_function) # my_function is pickled by reference
使用此 API,无需在所有工作节点上重新安装模块的新版本,也无需重新启动工作进程:只需重新启动具有新源代码的客户端 Python 进程即可。
请注意,此功能仍然是 实验性的,并可能在以下情况下失败
-
如果通过值序列化的函数/类的主体包含一个
import
语句>>> def f(): >>> ... from another_module import g >>> ... # calling f in the unpickling environment may fail if another_module >>> ... # is unavailable >>> ... return g() + 1
-
如果通过引用序列化的函数在其执行期间使用通过值序列化的函数。
运行测试
-
使用
tox
,测试运行所有支持的 Python 和 PyPy 版本的测试pip install tox tox
或者对于特定环境
tox -e py312
-
使用
pytest
仅运行您当前 Python 版本的测试pip install -r dev-requirements.txt PYTHONPATH='.:tests' pytest
历史
cloudpickle
最初由 picloud.com 开发,并作为客户端 SDK 的一部分提供。
PySpark(Apache Spark的Python接口)中包含了一份cloudpickle.py
的副本。Davies Liu、Josh Rosen、Thom Neale和其他Apache Spark开发者对该项目进行了显著改进,特别是添加了对PyPy和Python 3的支持。
cloudpickle
项目的目标是使其工作成果对Spark生态系统之外更广泛的受众可用,并使其更容易进一步改进,特别是通过一个专门的回归测试套件。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。