[pypy-dev] how can i pickle an application-level object from interpreter code?

Amaury Forgeot d'Arc amauryfa at gmail.com
Fri Oct 2 19:32:51 CEST 2009


2009/10/2 Philip Guo <pg at cs.stanford.edu>:
> Hi all,
> I'm brand-new to PyPy, and here is my question: I want to selectively pickle
> Python objects that appear in application-level code, from *within* the
> interpreter.  e.g., let's say i'm using the PyPy Python interpreter to run
> this program:
> import foo
> x = foo.ComplicatedObject()
> right after the interpreter creates an instance of foo.ComplicatedObject(),
> I want to serialize that instance to disk, in effect simulating this
> statement:
> pickle.dump(x, open('data.pickle'))
> What is the easiest way for me to do this from within the interpreter code?
> It seems like an instance object is represented within the interpreter as of
> type "class W_InstanceObject(Wrappable)", and I can't directly pickle that
> object.  If I could just call the Python standard library's pickle on 'x'
> from within the interpreter, that would be great.

This should be possible by using gateway.applevel, like the following code.
Be careful however that pickle.dump is itself a python function which
creates objects.
Modifying W_InstanceObject.__init__ this way is probably not a good idea...

Note: I wrote this quickly to get an idea; I did not test at all.
I took the idea from some other code in pypy/module/__builtin__/operation.py

from pypy.interpreter import gateway

dump_object = gateway.applevel(r'''
def dump_object(x):
    import pickle
    pickle.dump(x, open('data.pickle', 'w'))
''', filename =__file__).interphook('dump_object')

then you should be able to call it this way:
    dump_object(space, w_instanceObject)

Amaury Forgeot d'Arc

More information about the Pypy-dev mailing list