开发者

Unpickling problem in python under apache (mod_python)

I'm writing a web application that talks over network socket to a server that I develop in python. To simplify things I decided to pack the data into a class and transfer it after pickling.

To test the concept I've written a code that pickles the class and unpickles it but it doesn't work. Same code runs in python interpreter. Below is the code and the error I get:

class testClass:
    def __init__(self):
        self.blah       = 'bleh'
        self.meaning    = 42
        self.isComplete = False

    def dumpy(self):
        print self.blah
        print self.meaning
        print self.isComplete

def index():
    foo   = testClass()
    p_foo = pickle.dumps(foo)

    foo = pickle.loads(p_foo)

    foo.dumpy()

This is the error:

ImportError: No module named _mp_11b334e84556201b42d59ca560e0f6ad

MODULE CACHE DETAILS

Accessed: Fri May 20 16:23:51

2011 Generation: 0

_mp_11b334e84556201b42d59ca560e0f6ad {

FileName: '/var/www/stormstation-web/sea_monitor/management_client.py' Instance: 1 [IMPORT]

Generation: 1

Modified: Fri May 20 16:23:47 2011

Imported: Fri May 2开发者_如何学Go0 16:23:51 2011

}


Yes, this is the case.

You cannot easily use pickled classes, functions or class instances with mod_python.

This document describes the problem from the point of view of Sessions, but still applies to your usage: http://www.dscpl.com.au/wiki/ModPython/Articles/IssuesWithSessionObjects

Basic problem:

The source of the problems and limitations is how the operation of the "pickle" serialisation routine is affected by the module reloading mechanism implemented by mod_python. That is, the module loading mechanism as underlies the Python*Handler directives and as implemented by the apache.import_module() function. The particular types of data which are known to be affected are function objects and class objects.

Summarising:

In order to ensure that no strange problems at all are likely to occur, it is suggested that only basic builtin Python types, ie., scalars, tuples, lists and dictionaries, be stored in session objects. That is, avoid any type of object which has user defined code associated with it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜