跳转到主要内容

Pickler类用于扩展标准pickle.Pickler的功能

项目描述

cloudpickle

Automated Tests codecov.io

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 的序列化机制以导入可构建结构

cloudpicklepickle 之间的一个重要区别是,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生态系统之外更广泛的受众可用,并使其更容易进一步改进,特别是通过一个专门的回归测试套件。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

cloudpickle-3.0.0.tar.gz (21.2 kB 查看哈希值)

上传时间: 源代码

构建分发

cloudpickle-3.0.0-py3-none-any.whl (20.1 kB 查看哈希值)

上传时间: Python 3

支持者: