D
Danny Shevitz
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
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