我有一个程序可以使用matplotlib创建绘图 - 有时是线图,有时是NonUniformImages。我希望能够在以后重新打开这些情节,而无需再次完成整个创作过程。无论出于何种原因,它不断抛出PicklingError: Can't pickle 'RendererAgg' object
。我尝试过使用import dill as pickle
和import pickle
,以及所有4种不同的酸洗选项,但没有变化。
轴在这里定义:
class Imaging:
def function:
ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)
并在此处设置:( Imaging.figureProperties是一个列表,用于保存多个[ax1,ax2]
个对象。也与定义ax1
和ax2
的函数相同。)< / p>
Imaging.figureProperties.append([ax1,ax2])
最后,数据在这里被腌制(用户选择了i
,但它将在列表中):
class2:
with open(filename, 'wb') as f:
pickle.dump(Imaging.figureProperties[i-1],f)
我运行this question中的示例代码没有问题(只需稍加更改,例如在'wb'
中打开而不只是'w'
),只要我使用{{1} }。如果我使用标准import dill as pickle
,它会抛出相同的import pickle
。这是怎么回事?
答案 0 :(得分:2)
我是dill
作者。如果您编辑问题以提供可以测试的代码,我可以更好地测试您的代码。我想你上面的代码中可能只有拼写错误 - 它应该是def function(self):
。还有什么是class2:
?我只是切入追逐并序列化你要序列化的东西。您发布的代码并没有多大意义。
>>> import matplotlib.pyplot as plt
>>>
>>> class Imaging:
... def function(self):
... ax1 = plt.subplot(2,1,1)
... ax2 = plt.subplot(2,1,2)
...
>>> Imaging.figureProperties = []
>>>
>>> import dill
>>>
>>> ax1 = plt.subplot(2,1,1)
>>> ax2 = plt.subplot(2,1,2)
>>> Imaging.figureProperties.append([ax1, ax2])
>>> fp = dill.loads(dill.dumps(Imaging.figureProperties[0]))
>>> fp
[<matplotlib.axes._subplots.AxesSubplot object at 0x113085320>, <matplotlib.axes._subplots.AxesSubplot object at 0x113471eb8>]
当您使用它时,您正在使用的类非常没用,但是您要求序列化的代码会进行序列化。
答案 1 :(得分:1)
将Matplotlib更新为1.4.2解决了这些问题。