weird pickle behavior in Python 3.1.2 + Eclipse 3.5.2

Discussion in 'Python' started by kirby.urner@gmail.com, Jun 4, 2010.

  1. Guest

    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?

    Kirby Urner
    in Portland "Keep Portland Weird" Oregon
    , Jun 4, 2010
    #1
    1. Advertising

  2. Peter Otten Guest

    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
    Peter Otten, Jun 4, 2010
    #2
    1. Advertising

  3. Guest

    On Jun 4, 9:47 am, Peter Otten <> 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?

    Kirby
    , Jun 4, 2010
    #3
  4. Peter Otten Guest

    wrote:

    > On Jun 4, 9:47 am, Peter Otten <> 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
    Peter Otten, Jun 7, 2010
    #4
  5. On Mon, Jun 7, 2010 at 6:30 AM, Peter Otten <> wrote:
    > wrote:
    >
    >> On Jun 4, 9:47 am, Peter Otten <> 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.
    >



    I've taken a look at the pydev code and the issue seems to be in
    python itself. See: http://bugs.python.org/issue8943

    Cheers,

    Fabio
    Fabio Zadrozny, Jun 8, 2010
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. a pickle's pickle

    , Aug 2, 2005, in forum: Python
    Replies:
    4
    Views:
    372
  2. Michele Simionato
    Replies:
    2
    Views:
    1,859
    Michele Simionato
    May 23, 2008
  3. Replies:
    1
    Views:
    281
  4. dorayme
    Replies:
    1
    Views:
    603
    richard
    Jan 21, 2011
  5. Forafo San

    Weird python behavior

    Forafo San, Apr 24, 2013, in forum: Python
    Replies:
    4
    Views:
    112
Loading...

Share This Page