Graham Dumpleton
grahamd at dscpl.com.au
Mon Jun 13 00:49:08 EDT 2005
On 13/06/2005, at 12:10 PM, Bart wrote: > On 6/12/05, Graham Dumpleton <grahamd at dscpl.com.au> wrote: >> On 13/06/2005, at 11:14 AM, Bart wrote: >>> Hey there, >>> >>> Apologies if this has been asked and answered before, >>> but is there any way to make apache/mod_python >>> temporarily *not* reuse the same interpreter? >> No. >> >>> Google wasn't too helpful on the matter other >>> than providing the reasons. >>> >>> While I'm clear on why this is generally good, while >>> coding it's quite annoying that I have to restart >>> apache just to not get it to randomly fail on code >>> that's in reality any your-guess-is-as-good-as-mine >>> old version, but practically guaranteed not to be >>> the current one. >> What you want is automatic module reloading. >> >> Have a look at the automatic module reloading mechanism implicit >> within the apache.import_module() function. See documentation at: >> http://www.modpython.org/live/current/doc-html/pyapi-apmeth.html >> >> This same method is used by mod_python to load a handler. In that >> case auto reloading is controlled by the PythonAutoReload directive. >> http://www.modpython.org/live/current/doc-html/dir-other-par.html >> >> The current auto reloading mechanism has a number of shortcomings >> and will not always work, but depending on the complexity of your >> code it may be sufficient. > > 'Implicit' meaning I can use import normally rather than calling > apache.import_module, ie. that it should just be working? > And if the two are the same mechanism, doesn't that the > 'is there newer code' check is what's failing? No, the "import" statement is distinct and still is the normal Python module importing system. The words "implicit within" were a bad choice, read it as "implemented by". Because they aren't the same anything imported using "import" isn't in anyway automatically reloaded. Even if you replaced imports at global scope within a handler module with apache.import_module(), it still may not do what you want as the code which checks for changes will only detect a change in the handler module and not any module which is imported by it using apache.import_module(). This is because the check for the sub import is only done at the time of the call which is when the top level module is imported. Thus, only way to get it all imported correctly is to touch the top level handler to update the modification time. That way it will import the top level and because the sub import has changed it will then reimport it as well. One way of getting it to work a bit better is to sub import the module using apache.import_module() within the handler function itself each time it is called. That way the check of whether the sub import code has changed is on each request and any changes will be updated automatically. > I haven't disabled the PythonAutoReload thing (I'll enable it > explicitly in my config to be sure), so it should be working, right? > Are you telling me that (given it's not that) when it fails > this problem can't be solved through apache or mod_python at all? As I said, there are shortcomings in the apache.import_module() as it is currently implemented. > Is there any predictability to the method that I could affect? > Removing pyc's, touching everything, sending a signal to kill > running python interpreters in apache, something like that? Some people use the method of touching everything, but you will need to use apache.import_module() instead of the "import" statement for those parts of your web application you want to be capable of being reloaded. You should avoid using apache.import_module() on modules installed in site-packages though. > Actually, restarting apache is acceptable for me, but it > appears to me there just has to be a better way, because > presumably people develop this way... It is certainly possible to get it to work properly, just not with mod_python at the moment. Maybe in the future sometime it will be fixed. If restarts are an acceptable way of managing this at the moment, I would suggest you go with that. Graham
|