酸洗和取消用户定义的类

时间:2015-03-20 16:23:15

标签: python pickle

我有一个用户定义的班级' myclass'我用pickle模块存储在文件中,但是我有问题解开它。我有大约20个相同结构的不同实例,我保存在不同的文件中。当我读取每个文件时,当我收到错误时,代码可以处理某些文件,而不会处理其他文件:

'module' object has no attribute 'myclass'

我今天生成了一些文件,昨天生成了一些其他文件,我的代码只适用于今天生成的文件(我昨天和今天之间没有更改类定义)。

我想知道我的方法是不是很健壮,如果我不做我应该做的事情,例如也许我不能腌制用户定义的类,如果这在这个过程中引入了一些随机性。

另一个问题可能是我昨天生成的文件是在另一台机器上生成的 - 因为我在一个学术集群上工作,我有一些登录节点和一些计算节点,这些节点因架构而异。所以我在计算节点上生成昨天的文件,今天在登录节点上生成文件,我正在读取登录节点上的所有内容。


根据部分评论中的建议,我已安装dill并将其加载import dill as pickle。现在我可以从计算节点读取文件到同一群集的登录节点。但是,如果我尝试读取在一个集群的计算节点上生成的文件,则在另一个集群的登录节点上我不能。我在dill.py

中的_load_type(name)中获得了KeyError: 'ClassType'

是不是因为python版本不同?我用python2.7生成了文件,然后用python3.3读取它们。


编辑:

如果我在任何地方使用python 2.7,我都可以读取pickle文件。遗憾的是,用python 3编写的部分代码与python 2.7并不自动兼容:(

1 个答案:

答案 0 :(得分:1)

你能from mymodule import myclass吗?酸洗不会腌制这个类,只是对它的引用。要加载pickle对象,python必须能够找到用于创建对象的类。

例如

import pickle

class A(object):
    pass

obj = A()
pickled = pickle.dumps(obj)

_A = A; del A # hide class

try:
    pickle.loads(pickled)
except AttributeError as e:
    print(e)

A = _A # unhide class
print(pickle.loads(pickled))