[mod_python] Stopping Reimports

Cu _ pc_ at one.lv
Tue Aug 10 15:47:01 EDT 2004


mpy
Hello, 

I'd like to know if there is some elegant way to deal with the 
[notice] mod_python: (Re)importing module 'index' with path set to [...]

The mod_python.apache importing mechanism works correctly, the problem is,
it keeps reimporting the same files.

I don't think reimporting is the best solution for modules with same names but in different directories.

It degrades performance with unneeded imports. 

Then,
I try to use mod_python's sideeffect of not discarding variables when importing already 
loaded modules to cache frequently used data (If the module doesn't get reimported all the time, it's variables keep their values between subsequent requests). 
Every reimport causes the cached data to be reloaded.

Also, it pollutes error_log :)

My current "solution" is ugly, that's why I post here, maybe somebody will come up with something 
better.
The idea is - if i have to load a module "my_module", which is at /path/to/my_files,
don't load it as my_module, but as path_to_my_files_my_module
That way, modules with same names will be assigned different names in sys.modules and won't
get reloaded all the time.

It's as using 
from path.to.my.files imort my_module as path_to_my_files_my_module
instead of
from path.to.my.files imort my_module

Modules loaded with import_module are usually used by pointers, not by symbolic names so, as for
me, it's ok to load it with a different name.

my mod_python/apache.py import_module() now looks like this:

def import_module(module_name, autoreload=1, log=0, path=None):
    """
    Get the module to handle the request. If
    autoreload is on, then the module will be reloaded
    if it has changed since the last import.
    """
    
    parts = module_name.split('.')    
    if path:
      path2 = '_'.join(path).replace('/','_').replace('.','_').replace('-','_')[1:] + '_'
      mn = path2 + module_name
    else:
      mn = module_name

    # (Re)import
    import sys
    if sys.modules.has_key(mn):
        module = sys.modules[mn]
    else:
        
        _apache.log_error('Has to load: '+str(mn)+ '('+str(module_name)+')', APLOG_NOERRNO|APLOG_NOTICE)
       
        for i in range(len(parts)):
            mname = ".".join(parts[:i+1])
            f, p, d = imp.find_module(parts[i], path)
            try:
                _apache.log_error('Loading: '+mname, APLOG_NOERRNO|APLOG_NOTICE)
                module = imp.load_module(mname, f, p, d)
        
            finally:
                if f: f.close()
            if hasattr(module, "__path__"):
                path = module.__path__

        # dark magic
        if mn:
          if mn != mname:
            t = sys.modules.keys()
            t.sort()
            _apache.log_error('Current load: '+str(t), APLOG_NOERRNO|APLOG_NOTICE)
            _apache.log_error('Switching: '+mname+' <-> '+mn, APLOG_NOERRNO|APLOG_NOTICE)
            sys.modules[mn] = sys.modules[mname]
            del(sys.modules[mname])
  
            t = sys.modules.keys()
            t.sort()
            _apache.log_error('After switch: '+str(t), APLOG_NOERRNO|APLOG_NOTICE)

    return module

-------------------------------------------------------------------------------
http://www.one.lv - Tavs mobilais e-pasts!

Tagad lasi savu e-pastu ar mobilo telefonu - wap.one.lv!


More information about the Mod_python mailing list