Graham Dumpleton
grahamd at dscpl.com.au
Sun Feb 20 03:05:25 EST 2005
A few other comments about what you are trying to do. On 20/02/2005, at 6:07 PM, Gonzalo Sainz-Trápaga wrote: > Hi, > After reading the FAQ entry 3.1, i finally built my custom way to > import > modules, on the lines of: > > -- config.py -- > debug = True > -- > > -- anyscript.py -- > from mod_python.apache import import_module > config = import_module('config') > if config.debug: > # reload other modules > -- > > This is a bit lengthy and annoying but then i found this directive in > the 3.x docs: > > -- http://www.modpython.org/live/current/doc-html/dir-other-par.html -- > PythonAutoReload {On,Off} > (...) > By default, mod_python checks the time-stamp of the file and reloads > the > module if the module's file modification date is later than the last > import or reload. This way changed modules get automatically > reimported, > eliminating the need to restart the server for every change. > -- > > If I explicitly set this directive to On, i get the expected behaviour > without manually reloading modules on every script. But, if i don't set > it i get the "Off" behaviour, instead of the "On" one as advertised in > the docs. That can't be true. Code where top level module loading occurs is: module = import_module(module_name, autoreload=int(config.get("PythonAutoReload", 1)), log=debug) Thus, default is definitely "On" or enabled. > Actually I'm glad this directive exists and seems to do what I think it > does, but the FAQ must *really* be updated on this, and, if i'm not > mistaken, the default behaviour should be corrected either in the docs > or in mod_python (i would suggest the former, as automatically > reloading > modules is the standard interpreter behaviour). > > I wanted to check with you guys before I mess with the FAQ, in case i'm > getting something wrong. As well as pointing out that PythonAutoReload doesn't apply to your explicit use of import_module(), it is also worthwhile point out that if your "other modules" are changed, they will not actually be automatically reloaded in your example unless the top level file which imports them is also changed. To try and make this a bit clearer, imagine your top level module is A and it imports a submodule call B. If you change A, if PythonAutoReload is On, then A will be reloaded. B will not however be reloaded at that time but will be taken from the cache. This is because B hadn't been changed. Now, if you modify B but not A, nothing will happen at all. Ie., neither A or B will be reloaded. This is because the mod_python module import and caching system makes no attempt to detect that A needs reloading because of B changing. B will only be reloaded, if A is changed, thus forcing the re-execution of the import_module() function on B. This and other problems in import_module() mean it is a pain to use and many people resort to schemes such as touching all Python code files every time they make a change to one, just to ensure everything that potentially needs reloading is reloaded. This does though mean that things that didn't need reloading also get reloaded. In short, import_module() is broken. If you are curious about other import schemes, you might look at Vampire, which implements an import mechanism which does detect changes in subimports and will automatically reimport parents as necessary. Vampire is at "http://www.dscpl.com.au/projects/vampire". Graham
|