Graham Dumpleton
grahamd at dscpl.com.au
Tue Oct 4 01:25:58 EDT 2005
GATOR AIDE wrote .. > After updating mod_python 3.1.4 to 3.2.2b I am getting > an error: > > PythonHandler mod_python.publisher: TypeError: can't > pickle function objects > > I am storing a function in the session and calling > session.save(). (Which is when the error is raised.) > > Using mod_python 3.1.4 the code works just fine but > after the update I am now seeing this error. > > The code simply stores a dictionary and few function > callbacks in the session and loops through several > functions until it is done processing. > > Not sure if anyone else has had this problem? I > running centos 2.4.21-27.0.4.ELsmp on a x86_64 > platform. Python 2.4.2 (same error w/2.4.1). Apache > 2.0.46. > > I wasn't sure if this is the right place to post this, > so I apologize if I should have posted the question > elsewhere. I am going to hazard a guess and say that pickle probably only allows you to pickle a function objects where the function object resides in a module which was imported using "import", ie., lives in "sys.modules". In mod_python 3.2, mod_python.publisher handler modules are no longer imported using the Python "import" mechanism but are instead read in as strings and executed against a dictionary of an empty module which does not actually exist in sys.modules. def build(self, key, name, opened, entry): try: module = new.module(re_not_word.sub('_',key)) module.__file__ = key exec opened in module.__dict__ return module finally: opened.close() The error would seem reasonable under these circumstances because if it were pickled, it wouldn't perhaps be unable to unpickle it later as it wouldn't know the name of a module in "sys.modules" to associate the function reference to. Are you sure you can't use a string reference or something else as a handle to refer to the callback function rather than an actual function object? Graham
|