[IPython-dev] pushing python class definition to engines

Andrew Straw strawman at astraw.com
Tue Jul 15 20:30:35 EDT 2008


Robert Kern wrote:
> 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.
>   
OK. Thanks for the info. How do I do that/what do you mean? (Do I simply
make a string with my class definition and push that across?)

-Andrew



More information about the IPython-dev mailing list