weird pickle behavior in Python 3.1.2 + Eclipse 3.5.2

Peter Otten __peter__ at web.de
Fri Jun 4 12:47:47 EDT 2010


kirby.urner at gmail.com wrote:

> Here we are in an Eclipse pydev console, running Python 3.1.2.  For
> the most part, everything is working great.
> 
> However...
> 
>>>> import sys; print('%s %s' % (sys.executable or sys.platform,
>>>> sys.version))
> C:\Python31\python.exe 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC
> v.1500 32 bit (Intel)]
> 
>>>> import pickle
>>>> class Example:
> ...     def __init__(self):
> ...         self.name = "Hello"
> ...     def __repr__(self):
> ...         return "an Example object named {}".format(self.name)
> ...
> ...
>>>> obj = Example()
>>>> obj
> an Example object named Hello
> 
> Note that I'm opening in binary, like I'm supposed to with this
> latest protocol:
> 
>>>> f = open("testpickle.pkl",'wb')
> 
> Should be able to do this, no problemo:
> 
>>>> pickle.dump(obj, f)
> Traceback (most recent call last):
>   File "<console>", line 1, in <module>
>   File "C:\Python31\lib\pickle.py", line 1354, in dump
>     Pickler(file, protocol, fix_imports=fix_imports).dump(obj)
> _pickle.PicklingError: Can't pickle <class 'Example'>: attribute
> lookup builtins.Example failed
> 
> The above works fine in "naked Python" 3.1.2 by the way.
> So this could be a problem with Eclipse / Pydev and/or
> user error.  What am I missing?
> 
> Just normal data structures work:
> 
>>>> test = [1,2,3]
>>>> pickle.dump(test,f)
>>>> f.close()
>>>>
> 
> Any other Eclipse users out there who can at least duplicate this
> weirdness?

I can provoke the error in "naked" Python 3 by changing the 
Example.__module__ attribute:

Python 3.1.1+ (r311:74480, Nov  2 2009, 15:45:00)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> class Example:
...     pass
...
>>> pickle.dumps(Example())
b'\x80\x03c__main__\nExample\nq\x00)\x81q\x01}q\x02b.'
>>> Example.__module__ = "builtins"
>>> pickle.dumps(Example())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.1/pickle.py", line 1358, in dumps
    Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
_pickle.PicklingError: Can't pickle <class 'Example'>: attribute lookup 
builtins.Example failed

What's the value of __module__ when you run your code in Eclipse?

Peter



More information about the Python-list mailing list