weird pickle behavior in Python 3.1.2 + Eclipse 3.5.2

Peter Otten __peter__ at web.de
Mon Jun 7 05:30:56 EDT 2010


kirby.urner at gmail.com wrote:

> On Jun 4, 9:47 am, Peter Otten <__pete... at web.de> wrote:
> 
>> 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
> 
> Thank you for replying.
> 
> Here's from Eclipse console:
> 
>>>> Example.__module__
> 'builtins'
> 
>>>> __name__
> 'builtins'
> 
> Duplicating your result in naked Python:
> 
> Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit
> (Intel)] on win32
> Type "copyright", "credits" or "license()" for more information.
>>>> class Example:
> pass
> 
>>>> import pickle
>>>> Example.__module__
> '__main__'
>>>> f = open('testpickle.pkl','wb')
>>>> obj = Example()
>>>> obj
> <__main__.Example object at 0x02A26690>
>>>> pickle.dump(obj, f)
> 
>>>> Example.__module__ = 'builtins'
>>>> obj2 = Example()
> 
>>>> pickle.dump(obj2, f)
> Traceback (most recent call last):
>   File "<pyshell#12>", line 1, in <module>
>     pickle.dump(obj2, f)
>   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
> 
> So what if I'm in an Eclipse pydev console and
> change the Example.__module__ to '__main__'....
> 
>>>> 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:
> ...     pass
> ...
>>>> Example.__module__
> 'builtins'
>>>> Example.__module__ = '__main__'
>>>> obj = Example()
>>>> obj
> <__main__.Example object at 0x029E8FD0>
>>>> f = open('testpickle.pkl','wb')
>>>> 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 '__main__.Example'>:
> attribute lookup __main__.Example failed
>>>>
> 
> Dang.
> 
> Any insights?

Sorry, no. Consider a bug report to the pydev project.

Peter



More information about the Python-list mailing list