[Tutor] perplexing error with shelve REVISED

Eric Brunson brunson at brunson.com
Wed Oct 31 23:39:03 CET 2007


Orest Kozyar wrote:
>> Please post the entire traceback (omitting duplicate lines). 
>>     
>
> Sorry, I should have included the traceback.  I've revised the sample script
> so that it generates the traceback when run.  The sample script is at the
> very bottom of this email.
>
> ####### SCRIPT OUTPUT #######
> [kozyar]:~$ python example.py 
>
> Successfully retrieved and parsed XML document with ID 16842423
> Successfully shelved XML document with ID 16842423
> Successfully retrieved and parsed XML document with ID 16842422
>
> Traceback (most recent call last):
>   File "example.py", line 30, in <module>
>     data[badkey] = doc
>   File "/usr/lib64/python2.5/shelve.py", line 123, in __setitem__
>     p.dump(value)
> RuntimeError: maximum recursion depth exceeded
>
> Exception exceptions.RuntimeError: 'maximum recursion depth exceeded' in
> <bound method DbfilenameShelf.__del__ of {'16842423':
> <xml.dom.minidom.Document instance at 0x96f290>}> ignored
>
>
> ####### START SCRIPT #######
> import urllib, shelve
> from xml.dom import minidom
>
> baseurl = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?'
>
> params = {
>         'db':       'pubmed',
>         'retmode':  'xml',
>         'rettype':  'medline'
>         }
>
> badkey = '16842422'
> goodkey = '16842423' #or just about any other ID
>
> data = shelve.open('data.tmp', writeback=True)
>
> params['id'] = goodkey
> url = baseurl + urllib.urlencode(params)
> doc = minidom.parseString(urllib.urlopen(url).read())
> print 'Successfully retrieved and parsed XML document with ID %s' % goodkey
> data[goodkey] = doc
> print 'Successfully shelved XML document with ID %s' % goodkey
>
> params['id'] = badkey
> url = baseurl + urllib.urlencode(params)
> doc = minidom.parseString(urllib.urlopen(url).read())
> print 'Successfully retrieved and parsed XML document with ID %s' % badkey
>   


The problem seems to be with pickling the doc object.

try adding:

import pickle
print pickle.dumps(doc)

right here in your code.  Are you sure the XML is well formed?

If nothing else, you could try shelving the XML rather than the doc.

> data[badkey] = doc
> #Will fail on the above line
> print 'Successfully shelved XML document with ID %s' % badkey
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>   



More information about the Tutor mailing list