我用搁置保存了一些物品。在另一个文件中,我能够恢复这些对象。但是当我将存档复制到另一台计算机时,我会给_gdbm.error: File read error
。保存存储对象类的包可以在两台计算机上直接访问(但它们存储在不同的位置并添加了PYTHONPATH)。两台机器都运行在Ubuntu 13.10上,一台是32位,另一台是64位。
这些档案不应该与机器无关吗?
在64位机器上我得到了
>>> import shelve
>>> shelve.open('arch.db')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.3/shelve.py", line 232, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File "/usr/lib/python3.3/shelve.py", line 216, in __init__
Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
File "/usr/lib/python3.3/dbm/__init__.py", line 94, in open
return mod.open(file, flag, mode)
_gdbm.error: File read error
在32位机器上运行。
当我在64位机器上创建存档时,它可以在32位机器上打开,但是交互式python提示崩溃了:
>>> import shelve
>>> s = shelve.open('arch.db')
>>> for i in s.items(): print(i)
...
gdbm fatal: lseek error
我甚至没有追溯。
这真的很烦人,我打算在两台计算机上工作,但目前我被绑定在我的32位eeepc上,因为我已经在存档中节省了很多。
答案 0 :(得分:0)
问题是shelve
使用gdbm(提供为dbm.gnu
作为默认后端来存储序列化对象。使用gdbm创建的文件取决于系统的体系结构,因此仅适用于32位或 64位系统。
有一些工具(gdbmexport
或gdbm_dump
)允许您转换gdbm
文件,但是,如果要从两个系统访问文件,工作流会变得容易出错定期。
幸运的是,python提供了不同的后端:dbm.gnu
,dbm.ndbm
和dbm.dumb
。后两者与平台无关。
import shelve
import dbm
dbm._defaultmod = dbm.ndbm
db = shelve.open('somename')
具有上述代码的数据库可用于64位和32位系统。
只有在创建文件时才需要设置默认后端。 dbm
在打开之前检查数据库的文件类型并使用正确的后端。
请注意,上面的代码更改了整个python进程的默认dbm。如果它依赖gdbm
作为默认值,则另一个组件可能会中断。