Python 酸洗和取消酸洗用户定义类

Python 酸洗和取消酸洗用户定义类,python,pickle,Python,Pickle,我有一个用户定义的类“myclass”,我将它存储在pickle模块的文件中,但是我在取消勾选它时遇到了问题。我有大约20个相同结构的不同实例,保存在不同的文件中。当我读取每个文件时,当我出现错误时,代码对某些文件有效,而对其他文件无效: 'module' object has no attribute 'myclass' 我今天和昨天分别生成了一些文件,我的代码只对今天生成的文件起作用(昨天和今天之间我没有更改类定义) 我想知道我的方法是否健壮,如果我没有做我应该做的事情,例如,可能我不能p

我有一个用户定义的类“myclass”,我将它存储在
pickle
模块的文件中,但是我在取消勾选它时遇到了问题。我有大约20个相同结构的不同实例,保存在不同的文件中。当我读取每个文件时,当我出现错误时,代码对某些文件有效,而对其他文件无效:

'module' object has no attribute 'myclass'
我今天和昨天分别生成了一些文件,我的代码只对今天生成的文件起作用(昨天和今天之间我没有更改类定义)

我想知道我的方法是否健壮,如果我没有做我应该做的事情,例如,可能我不能pickle用户定义的类,如果这在过程中引入了一些随机性

另一个问题可能是我昨天生成的文件是在另一台机器上生成的——因为我在一个学术集群上工作,我有一些登录节点和一些计算节点,它们在体系结构上有所不同。所以我在计算节点上生成了昨天的文件,在登录节点上生成了今天的文件,我正在读取登录节点上的所有内容


正如一些评论中所建议的,我已经安装了
dill
,并用
import-dill-As-pickle
加载了它。现在,我可以将文件从计算节点读取到同一集群的登录节点。但是,如果我试图读取在一个集群的计算节点上生成的文件,那么在另一个集群的登录节点上就无法读取。我在dill.py中的加载类型(name)中得到了
keyrorm:'ClassType'

这可能是因为python版本不同吗?我用python2.7生成了这些文件,并用python3.3读取它们


编辑:


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

您能从mymodule导入myclass中
吗?
?Pickling不会对类进行pickle,只是对它的引用。要加载pickle对象,python必须能够找到用于创建对象的类

例如


听起来所使用的python版本/库可能不同。请看一看-您可能需要显式设置协议。如果python版本或任何库的版本不同,则pickle对象可能无法在计算机之间进行转换(seconding@MarcusMüller)。当您看到
'module'对象没有属性“myclass”
时,这意味着正在加载
模块,但在其中找不到对
myclass
的引用。当包在内部移动函数或类,并留下名称引用或(更糟)时,通常会发生这种情况用于保持向后兼容性的类实例。您看到的错误对于curried函数和对类实例的引用也是常见的。您可以使用序列化程序(如
dill
),该序列化程序具有清除整个类定义(而不是通过引用)的选项,这可能会使您与不同版本的python或库隔离。但是,它对已构建的pickle没有任何作用。设置协议并不能解决我的问题,但现在我使用的是
dill
,它可以工作如果您看到这一点,您可能实际上关心的是使类可pickle:
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))