dynamic import/reload of modules

Quinn Dunkan quinn at retch.ugcs.caltech.edu
Tue Aug 7 15:08:30 EDT 2001


On Tue, 07 Aug 2001 10:54:34 GMT, Thomas Weholt <thomas at gatsoft.no> wrote:
>Say I got a folder-structure like this :
>
>/home/thomas/dev/modules/test1
>/home/thomas/dev/modules/test2
>
>they both contain two files:
>__init__.py
>handler.py
>
>The handler.py contains a class handlerclass, that's different for each of
>the handler files
>
>How can I import the handler.py module for each folder, be able to reload it
>and create object-instances from them?
>I want to be able to say 'mymodules.reload()' and reload them too.
>
>The point is to be able to easily create and import several modules into a
>server without stopping the server itself. I want to be able to create a
>folder in the /home/thomas/dev/modules-folder, put to files into it, call
>reload on the server and have the modules available inside the running
>server. I cannot know what the folder inside /home/thomas/dev/modules will
>be called, but it will contain a handler.py defining a handlerclass-object
>and a __init__.py ( if that's necessary ).
>
>Any clues or pointers?
>
>It's for use in medusa. I want to be able to dynamically define handlers
>that processes requests, and reload them.

I think you're interested in __import__ or the imp module.  This is untested,
off the top of my head.  You shouldn't need __init__.py for this.

class MyModules:
    def __init__(self, directory):
        self.directory = directory
        self.reload()
    def reload(self):
        self.handlers = []
        for fn in os.listdir(self.directory):
            if not fn.endswith('.py'):
                continue
            fn = os.path.join(self.directory, fn)
            try:
                self.handlers.append(imp.load_module((open(fn), fn,
                    ('.py', 'r', imp.PY_SOURCE))))
            except:
                log_error(sys.exc_info()[1])

    # for example
    def handler(self, data):
        for m in self.handlers:
            if m.can_handle(data):
                return m.handlerclass(data)
    def all_handlers(self):
        return [ h.__name__ for h in self.handlers ]

I don't remember if imp.load_module tries to cache in sys.modules, but if it
does, you may want to find a way that doesn't or remove it from the cache.



More information about the Python-list mailing list