[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