[IPython-dev] pushing python class definition to engines
Robert Kern
robert.kern at gmail.com
Tue Jul 15 20:16:39 EDT 2008
Andrew Straw wrote:
> After seeing Brian Granger's great demo of the parallel abilities in
> IPython last week at the SIAM conference, I'm playing with ipython trunk
> which I just pulled out of launchpad (for this reason, I'm posting on
> the -dev list).
>
> Anyhow, if I start a client in the usual way:
>
> from IPython.kernel import client
> mec = client.MultiEngineClient()
>
> I can easily push Python integers:
>
> a=5
> mec['a'] = a
> print mec.gather('a')
>
> But pushing classes doesn't work:
>
> class MyObj(object):
> def __init__(self,x):
> print 'PID',os.getpid()
> self.x=x
>
> mec['MyObj'] = MyObj
> print mec.gather('MyObj')
>
> That gives the following error. How can I push a class definition to my
> engines?
It's really tricky since class objects normally don't really serialize. Pickles
just contain a reference to the fully-qualified name of the class. In this case,
it's __main__.MyObj. Since there is no MyObj in __main__ in your remote
namespace, you get the error you see. You will have to push actual code to your
remote kernels.
--
Robert Kern
"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
More information about the IPython-dev
mailing list