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