Howdy, 

In my app I need to exec user text that defines a function. I want this
function to unpickle an object. Pickle breaks because it is looking for
the object definition that isn't in the calling namespace. 

I have mocked up a simple example that shows the problem. Run this 
first code (from create_pickle.py) to create the pickle.

create_pickle.py: (run this first)

#############################################
import cPickle

# the pickle file name
file_name = 'd:\\temp\\test1.pickle'

# define a class
class Tree(object):
        pass


def main():
        # instantiate   
        t = Tree()
                
        # create the sweet pickle
        fp = open(file_name, 'wb')
        cPickle.dump(t, fp)
        fp.close()
        
        # try to unpickle directly
        fp = open(file_name, 'rb')
        result = cPickle.load(fp)
        fp.close()
        print "unpickling directly works just fine, result = ", result

if __name__=='__main__':
        main()
#############################################

run this second:

exec_pickle.py
#############################################
# this file shows a problem with sweet pickle in an exec statement

# the pickle file name
file_name = 'd:\\temp\\test1.pickle'

# code to be turned into a function
code_text = '''
def include():
  print "this works!"
'''

# a function for creating functions
def create_fun(code_text):
        clean_dict = {} 
        exec code_text in clean_dict
        return clean_dict['include']

# include_fun is a bona fide function
include_fun = create_fun(code_text)

# this works
include_fun()


# now try to load the pickle in an exec statement
code_text = '''
def include(file_name):
  print "processing file_name: ", file_name
  import cPickle
  fp = open(file_name, "rb")
  result = cPickle.load(fp)
  fp.close()
  print "result = ", result
'''

# create the new include_fun
include_fun = create_fun(code_text)

# run it
include_fun(file_name)

#############################################

Can anyone enlighten me what I need to do to exec_pickle.py
to get this to work?

thanks,
Danny

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to