搁置档案不能在其他计算机上打开

时间:2014-03-25 20:10:54

标签: python-3.x shelve

我用搁置保存了一些物品。在另一个文件中,我能够恢复这些对象。但是当我将存档复制到另一台计算机时,我会给_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上,因为我已经在存档中节省了很多。

1 个答案:

答案 0 :(得分:0)

问题是shelve使用gdbm(提供为dbm.gnu作为默认后端来存储序列化对象。使用gdbm创建的文件取决于系统的体系结构,因此仅适用于32位 64位系统。

有一些工具(gdbmexportgdbm_dump)允许您转换gdbm文件,但是,如果要从两个系统访问文件,工作流会变得容易出错定期。

幸运的是,python提供了不同的后端:dbm.gnudbm.ndbmdbm.dumb。后两者与平台无关。

import shelve
import dbm
dbm._defaultmod = dbm.ndbm
db = shelve.open('somename')

具有上述代码的数据库可用于64位和32位系统。

只有在创建文件时才需要设置默认后端。 dbm在打开之前检查数据库的文件类型并使用正确的后端。

请注意,上面的代码更改了整个python进程的默认dbm。如果它依赖gdbm作为默认值,则另一个组件可能会中断。

相关问题