我试图使用泡菜转储一个MDAnalysis.universe对象,但是我得到了错误消息,如
Traceback (most recent call last):
File "convert.py", line 9, in <module>
blob = pickle.dumps(u)
File "/usr/lib/python2.7/pickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "/usr/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.7/pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "/usr/lib/python2.7/pickle.py", line 419, in save_reduce
save(state)
File "/usr/lib/python2.7/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/usr/lib/python2.7/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems
save(v)
File "/usr/lib/python2.7/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/usr/lib/python2.7/copy_reg.py", line 84, in _reduce_ex
dict = getstate()
TypeError: 'AtomGroup' object is not callable任何建议都将不胜感激!
发布于 2014-04-15 07:11:48
更新的答案(适用于MDAnalysis≥2.0)
自从MDAnalysis 2.0.0 (2021年8月)以来,宇宙可以被腌制。
import MDAnalysis as mda
import pickle
u = mda.Universe(topology, trajectory)
pickle.dump(u, open("universe.pkl", "wb"))
# load pickled universe
u_pickled = pickle.load(open("universe.pkl", "rb"))
# test that we get same positions
(u_pickled.atoms.positions == u.atoms.positions).all()
# -> True
# but that universes are different
u == u_pickled
# -> False还请参阅用户指南中的并行化分析。
旧答案
MDAnalysis.Universe对象包含一些不能被标准机制序列化和腌制的对象,例如打开的文件描述符。我们需要编写专门的__getstate__()和__setstate__()方法,如酸洗协议中所描述的,但这些方法在当前的0.8.1 (2014年4月)版本中都没有实现。
Manel在他的对MDAnalysis 173号问题的评论:泡菜搜索__getstate__()方法中解释了具体的错误。虽然这还没有实现,但Universe管理自己的属性以动态生成“虚拟属性”,将其解释为原子选择,并最终返回一个空的AtomGroup实例。这反过来被调用,因为泡菜相信它是__getstate__的本地实现。但是,AtomGroup是不可调用的,并且会导致错误。
正如您可能注意到的那样,通过在MDAnalysis用户列表上询问或提交问题,您得到了更快的响应-- Stackoverflow通常在开发人员列表中回答这些特定问题的级别较低。
https://stackoverflow.com/questions/22666400
复制相似问题