[mod_python] restricted mode in server cleanup callback?

David Fraser davidf at sjsoft.com
Mon Apr 26 17:20:47 EST 2004

Stéphane Bidoul wrote:

>I'm having problems with server cleanup callbacks
>(on windows, with apache 2.0.49 and mod_python 3.1.3):
>For instance, with
>def endChild(data):
>    f = file("test.log","a")
>    try:
>       print >> f, "endChild", data
>    finally:
>       f.close()
>firstTime = 1
>def handler(req):
>    if firstTime:
>        global firstTime
>        req.server.register_cleanup(req,endChild,("endChild data",)
>        firstTime = 0
>Sometimes, the endChild function runs normally,
>but sometimes, I get this in apache error.log:
>[notice] Child 1284: Exit event signaled. Child process is ending.
>[notice] Child 1284: Released the start mutex
>[notice] Child 1284: Waiting for 250 worker threads to exit.
>[notice] Child 1284: All worker threads have exited.
>[error] python_cleanup: Error calling cleanup object <function endChild at
>[error]     exceptions.IOError: file() constructor not accessible in
>restricted mode
>[notice] Child 1284: Child process is exiting
>[notice] Parent: Child process exited successfully.
>Why is python thinking it is in restricted mode?
>I'm prepared to launch my debugger, but I've no clue
>where to search first, so any hint is most welcome.
>Thanks in advance.
I reported this on the python-dev list recently, and have quoted the 
thread below.
Not much info seems to be available, but basically the code is being 
called with a different interpreter to the one used to create some 
objects or something like that.
I'd appreciate any further info you find out


> Just for reference, these are the URLs and info I've found on this 
> problem.
> There doesn't seem to be much info at all in the Python docs / 
> newsgroups.
> I have been trying to set up a testcase but at the moment it crashes 
> Apache just trying to call a simple servercleanup (with pass) so I 
> need to work at it a bit...
> http://4suite.org/docs/FAQ.xml
>> Why do I get codec or other strange errors when running under 
>> mod_python?
>> There is a known problem with mod_python in Python 2.2 and older. 
>> mod_python is running in restricted mode, and this is considered by 
>> the mod_python folks to be a bug. Anything which introspects (like 
>> 4Suite) or does anything a restricted interpreter can't do will fail 
>> with a cryptic exception. The solution is to upgrade to Python 2.3, 
>> and use a recent build of mod_python (3.1 or newer).
> http://mail.python.org/pipermail/python-list/1999-April/000903.html
> (1999 discussion of this problem)
>> This alleviates the problem and makes it work.  Outside of not
>> finalizing interpreters (which alleviates it somewhat, but makes the
>> code run in restricted mode since __builtins__ of the unpickled objects
>> isn't the same as the "current" __builtins__), I don't know of any other
>> way to fix this.
> http://groups.google.com/groups?th=bfe053aba305ba1c&seekm=35A102B1.182B68A2%40starmedia.net#link1 
> (1998 discussion of this problem)
>> In the course of playing with the pyapache, I've run into the situation
>> where the interpreter complains about being in restricted mode.  What
>> I've been able to figure out is this: if the __builtins__ of the current
>> frame is different than the __builtins__ of the current top frame (read
>> as current thread), it is in restricted mode.  Is this correct? 
> http://groups.google.com/groups?th=fdeaf811901bc4f&seekm=mt2.0-17287-914742573%40news.informatik.uni-bonn.de 
> (ancient announcement of httpady)
>> 1. A bug related to the way multiple intrpreters were implemented 
>> that would
>> occasionally use objects created in one interpreter in another. The 
>> bug would manifest
>> itself by Python complaining that __dict__ is not available in 
>> restricted mode.  
> David Fraser wrote:
>> mod_python 3.1.3 running on Windows
>> Thanks for the explanation, that makes sense why I couldn't find the 
>> code...
>> I'll try and compare the request and server implementations of 
>> setting the cleanup function and work out why this is happening...
>> David
>> Gregory (Grisha) Trubetskoy wrote:
>>> What version of mod_python is this?
>>> Restricted mode is a strange beast, in that there isn't really anything
>>> like a "restricted mode" flag, but it looks at a pointer somwhere 
>>> (don't
>>> remember now), and if it's not what is expected, it concludes that 
>>> it's in
>>> restricted mode. So this behaviour is actually a sign of a bug where an
>>> object is created in one subinterpreter but is running in another... 
>>> These
>>> bugs can be hard to track down.
>>> Grisha
>>> On Tue, 6 Apr 2004, David Fraser wrote:
>>>> Hi
>>>> It seems that server cleanup functions registered with
>>>> server.register_cleanup run in restricted mode.
>>>> I'm trying to use them to close a database connection and being run in
>>>> restricted mode causes problems.
>>>> I can't see in the code where this gets set, but I get the 
>>>> following error:
>>>> [Tue Apr 06 17:16:01 2004] [error] python_cleanup: Error calling 
>>>> cleanup
>>>> object <bound method jLogbookMultiServer.onshutdown of
>>>> <jLogbook.python.jlogbook.jLogbookMultiServer object at 0x00A62670>>
>>>> [Tue Apr 06 17:16:01 2004] [error]     exceptions.RuntimeError:
>>>> instance.__dict__ not accessible in restricted mode
>>>> Is there a reason that the server functions needed to be run in
>>>> restricted mode, or is there a better way I should do this?
>>>> David

More information about the Mod_python mailing list