diff --git a/IPython/zmq/codeutil.py b/IPython/zmq/codeutil.py new file mode 100644 index 0000000..31e0361 --- /dev/null +++ b/IPython/zmq/codeutil.py @@ -0,0 +1,39 @@ +# encoding: utf-8 + +"""Utilities to enable code objects to be pickled. + +Any process that import this module will be able to pickle code objects. This +includes the func_code attribute of any function. Once unpickled, new +functions can be built using new.function(code, globals()). Eventually +we need to automate all of this so that functions themselves can be pickled. + +Reference: A. Tremols, P Cogolo, "Python Cookbook," p 302-305 +""" + +__docformat__ = "restructuredtext en" + +#------------------------------------------------------------------------------- +# Copyright (C) 2008 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Imports +#------------------------------------------------------------------------------- + +import new, types, copy_reg + +def code_ctor(*args): + return new.code(*args) + +def reduce_code(co): + if co.co_freevars or co.co_cellvars: + raise ValueError("Sorry, cannot pickle code objects with closures") + return code_ctor, (co.co_argcount, co.co_nlocals, co.co_stacksize, + co.co_flags, co.co_code, co.co_consts, co.co_names, + co.co_varnames, co.co_filename, co.co_name, co.co_firstlineno, + co.co_lnotab) + +copy_reg.pickle(types.CodeType, reduce_code) \ No newline at end of file diff --git a/IPython/zmq/newserialized.py b/IPython/zmq/newserialized.py index a534d2c..2b5378a 100644 --- a/IPython/zmq/newserialized.py +++ b/IPython/zmq/newserialized.py @@ -21,15 +21,13 @@ __test__ = {} import cPickle as pickle -# from twisted.python import components -# from zope.interface import Interface, implements - try: import numpy except ImportError: pass -from IPython.kernel.error import SerializationError +class SerializationError(Exception): + pass #----------------------------------------------------------------------------- # Classes and functions diff --git a/IPython/zmq/pickleutil.py b/IPython/zmq/pickleutil.py index a52fc69..b3b09ee 100644 --- a/IPython/zmq/pickleutil.py +++ b/IPython/zmq/pickleutil.py @@ -18,8 +18,8 @@ __docformat__ = "restructuredtext en" from types import FunctionType # contents of codeutil should either be in here, or codeutil belongs in IPython/util -from IPython.kernel import codeutil from IPython.zmq.parallel.dependency import dependent +import codeutil class CannedObject(object): def __init__(self, obj, keys=[]):