【发布时间】: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