【问题标题】:How to Serialize a user defined function in Python如何在 Python 中序列化用户定义的函数
【发布时间】:2020-01-30 06:14:08
【问题描述】:

读了很多之后我才知道pickle不能序列化Python中的函数或类(至少在Windows的3.6版本中)。但是我也看到很多人使用dill进行序列化。但是当我尝试时,我得到了错误。以下是我使用的简单代码:

import dill
def cube(x):
    x**x**x

with open('outfile', 'wb') as pickle_file:
    dill.dump(cube, pickle_file)

这是我得到的错误:

py4j.protocol.Py4JError: An error occurred while calling o0.__getstate__. Trace:
py4j.Py4JException: Method __getstate__([]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:335)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:344)
    at py4j.Gateway.invoke(Gateway.java:279)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:209)
    at java.lang.Thread.run(Thread.java:748)

总结一下我对序列化的需求是我想使用序列化,因为我想在 Python 中使用多处理(池类)。阅读文档后,我知道池类腌制对象以执行多处理,并且作为函数或类不能腌制,pathos.multiprocessing 库声称可以这样做,因为它使用 dill 进行序列化。但是当我使用它时,它给了我我在帖子中提到的错误

谁能帮我找出问题,或者让我知道是否有其他方法可以序列化 Python 中的类或函数。

提前致谢

【问题讨论】:

  • 为什么会有一个充满py4j消息的错误?您显示的代码根本没有使用 Py4j。是什么让您认为函数和类不能在 Windows 上腌制?
  • 函数和类可以有点被腌制。如果解封数据的代码首先导入了腌制数据的代码正在使用的所有模块和类,那么它应该能够正确地重建所有类实例。但这可能与您的Py4JError 完全不同。无论进口情况如何,我都不认为酸洗过程会崩溃。
  • 向我们发布一个在干净的 shell 中运行的 MCVE(可重现示例),没有任何 py4j 依赖项。确保包含运行示例所需的所有导入,但没有运行它实际上不需要的导入。如果从 py4j 导入导致问题,那么这似乎是向 py4j 维护者报告的错误。

标签: python python-3.x serialization pickle dill


【解决方案1】:

序列化函数的两种简单方法 将序列化其名称和拥有模块名称, 供import后续使用, 或dis 反汇编其字节码。

这听起来像XY question

...您正在尝试解决问题 X,并且您认为解决方案 Y 可行,但不是询问 X [您询问 Y]

请随意问我们真正的问题,X。 你必须有一个更高层次的目标 试图通过序列化一些概念来满足 的“功能”。 问一个新问题, 您在其中向我们展示了您正在使用的代码。

另外,计算x ** x ** x 是一个非常好的函数, 但它与计算x ** 3 完全不同。

编辑

multiprocessing 的一个经典难题是 你最终得到一个“难以序列化”的对象 属性,例如与数据库的开放 TCP 连接。 然后你创建一个池p 并尝试p.map( ... ), 只是被告知某些事情不能序列化。 嗯,最简单的解决方法是避免创建这样的东西 首先,不是在p.map 之前。 偷懒。 p.map 启动后初始化它们 在子进程中执行您的代码。 那么就不需要泡菜或莳萝运输了 对孩子的疯狂的事情,因为孩子 可以自己构建这些东西。

【讨论】:

  • 你有例子来说明吗?谢谢
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 2022-07-06
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2015-12-14
  • 2015-07-24
相关资源
最近更新 更多