[Tutor] Alternative for Shelve

Kent Johnson kent37 at tds.net
Tue May 12 12:58:56 CEST 2009


On Tue, May 12, 2009 at 3:59 AM, Timo <timomlists at gmail.com> wrote:
> Alan Gauld schreef:
>>
>> "Timo" <timomlists at gmail.com> wrote
>>
>>> I have an issue with the Shelve module. It works great for my needs, the
>>> only problem is that a file made with Shelve isn't interchangable between
>>> different computers.
>>
>> I thought it would be.
>> What kind of computers are you having issues with?
>> And what kind of issues?
>
> Currently only tested between Ubuntu and Windows on the same computer.
> This is the end of the traceback:
> bsddb.db.DBInvalidArgError: (22, 'Invalid argument -- </path/to/shelvefile>:
> unsupported hash version: 9')

shelve relies on the anydbm module for storage. anydbm may use any one
of several actual database implementations (dbhash, gdbm, dbm or
dumbdbm) depending on what is available. I guess you have different
modules available on the two machines. You can find out which module
is being used like this:

In [7]: import anydbm
In [8]: anydbm._defaultmod
Out[8]: <module 'dbhash' from
'/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/dbhash.pyc'>

You could force the use of a common db module by opening the file
explicitly. For example, to use dumbdbm, which is slow, simple and
guaranteed to be available, something like this (untested) should
work:

import dumbdbm
from shelve import Shelf

shelf = Shelf(dumbdbm.open('myfile', 'c'))

Kent


More information about the Tutor mailing list