2014-03-25 103 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

相關問題