2014-03-25 136 views
2

我保存了一些搁置的物体。在另一个文件中,我能够恢复这些对象。但是,当我将档案复制到另一台电脑时,给我一个_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

两台计算机上的文件都有相同的md5sum – sauerburger

+0

如果尝试使用'shelve.open('arch')'会发生什么?一些dbm后端默认将'.db'添加到文件名中。 – mata

+0

当我省略扩展名时,shelve没有找到该文件... – sauerburger

回答

0

问题是shelve使用gdbm(提供为dbm.gnu作为默认后端存储串行化对象。与GDBM创建的文件依赖于系统的结构,因此仅在32位 64位系统可用。

有一些工具(gdbmexportgdbm_dump),它允许你在gdbm文件转换,然而,工作流,如果你想访问定期从两个系统中的文件变得容易出错。

Fortunat只是,python提供了不同的后端:dbm.gnu,dbm.ndbmdbm.dumb。后两者独立于平台。

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

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

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

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

+0

转换后端的小工具:https://gitlab.sauerburger.com/frank/c-shelve – sauerburger

相关问题