我有一个用户定义的类“myclass”,我将其存储在文件中pickle
模块,但我在解封它时遇到问题。我有大约 20 个相同结构的不同实例,我将它们保存在不同的文件中。当我读取每个文件时,代码适用于某些文件,而不适用于其他文件,当我收到错误时:
'module' object has no attribute 'myclass'
我今天生成了一些文件,昨天生成了一些文件,我的代码仅适用于今天生成的文件(我在昨天和今天之间没有更改类定义)。
我想知道我的方法是否不健壮,如果我没有做我应该做的事情,例如我可能无法腌制用户定义的类,以及这是否在过程中引入了一些随机性。
另一个问题可能是我昨天生成的文件是在不同的机器上生成的 -- 因为我在学术集群上工作,所以我有一些登录节点和一些计算节点,它们因架构而异。所以我在计算节点上生成了昨天的文件,在登录节点上生成了今天的文件,并且我正在读取登录节点上的所有内容。
根据一些评论的建议,我已经安装了dill
并加载它import dill as pickle
。现在我可以从同一个集群的计算节点到登录节点读取文件了。但是,如果我尝试读取一个集群的计算节点上生成的文件,则无法在另一个集群的登录节点上读取。我明白了KeyError: 'ClassType'
在 dill.py 的 _load_type(name) 中
难道是因为python版本不同?我已经用 python2.7 生成了文件,并用 python3.3 读取了它们。
EDIT:
如果我到处使用 python 2.7,我可以读取 pickled 文件。遗憾的是,我的部分代码是用 python 3 编写的,并不自动与 python 2.7 兼容:(
Can you from mymodule import myclass
? Pickling 不会对类进行 pickle,而只是对其进行引用。要加载 pickled 对象,python 必须能够找到用于创建该对象的类。
eg.
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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)