shelve portability problem
nadim_ghaznavi at my-deja.com
nadim_ghaznavi at my-deja.com
Thu Jul 29 16:54:21 EDT 1999
First of all, I'd like to apologize for posting this twice, I
accidently posted this as part of the "COM bites - help please" thread!
Here it is again:
I'm having a problem moving a Python shelve ODB from Solaris to Linux.
Here's some sample code to demo the problem:
On the Solaris Platform:
# python
Python 1.5.2 (#1, Jun 5 1999, 15:51:52) [GCC 2.8.1] on sunos5
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import shelve
>>> friends = ['Jane','Jan','Simon']
>>> odb = shelve.open('odbfile')
>>> odb['foo']=friends
>>> odb.close()
Which leaves me with two files:
# ls -l
-rw-r--r-- 1 root other 0 Jul 29 13:50 odbfile.dir
-rw-r--r-- 1 root other 1024 Jul 29 13:57 odbfile.pag
To confirm that all is well, lets have a look at the data again: On
Solaris:
# python
Python 1.5.2 (#1, Jun 5 1999, 15:51:52) [GCC 2.8.1] on sunos5
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import shelve
>>> samedb = shelve.open('odbfile')
>>> buddies = samedb['foo']
>>> buddies
['Jane', 'Jan', 'Simon']
>>> samedb.close()
As expected, the data is still in the odb. Next we'll move the
odbfile.dir and odbfile.pag to the Linux platform (I used FTP, nothing
strange there).
# ls -l
-rw-r--r-- 1 root root 0 Jul 29 13:59 odbfile.dir
-rw-r--r-- 1 root root 1024 Jul 29 13:59 odbfile.pag
# python
Python 1.5.1 (#1, Mar 21 1999, 22:49:36)
[GCC egcs-2.91.66 19990314/Li on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import shelve
>>> nodb = shelve.open('odbfile')
>>> nodb.keys()
[]
>>> nodb.close()
>>>
# ls -l
-rw-r--r-- 1 root root 4096 Jul 29 14:00 odbfile
-rw-r--r-- 1 root root 0 Jul 29 13:59 odbfile.dir
-rw-r--r-- 1 root root 1024 Jul 29 13:59 odbfile.pag
What seems to be happening is that Solaris is storing the data in an old
DBM style database, and Linux is using a new gdbm format. When I try
opening the old Solaris ODB, python incorrectly opens a new gdbm ODB
instead.
A couple of things to note: I do have the free gdbm package installed
on my solaris platform (even though Python isn't using it):
# pkginfo GNUgdbm
application GNUgdbm gdbm
I know I can work around this by using pickle and a specific DB module,
but does anyone know how I can get it working using the shelve module?
Nadim
Sent via Deja.com http://www.deja.com/
Share what you know. Learn what you don't.
More information about the Python-list
mailing list