Hi folks. I'm working on an auto-reload feature for WHIFF http://whiff.sourceforge.net (so you have to restart the HTTP server less often, ideally never).
I have the following code to reload a package module "location" if a file is added to the package directory. It doesn't work on Windows XP. How can I fix it? I think the problem is that getmtime(dir) doesn't change on Windows when the directory content changes? I'd really rather not compare an os.listdir(dir) with the last directory content every time I access the package...
                if not do_reload and hasattr(location, "__path__"):
                    path0 = location.__path__[0]
                    if os.path.exists(path0):
                        dir_mtime = int( os.path.getmtime(path0) )
                        if fn_mtime<dir_mtime:
                            print "dir change: reloading package root", location
                            do_reload = True
                            md_mtime = dir_mtime
In the code the "fn_mtime" is the recorded mtime from the last (re)load.
... added comment: I came up with the following work around, which I think may work, but I don't care for it too much since it involves code generation. I dynamically generate a code fragment to load a module and if it fails it tries again after a reload. Not tested yet.
GET_MODULE_FUNCTION = """
def f():
    import %(parent)s
    try:
        from %(parent)s import %(child)s
    except ImportError:
        # one more time...
        reload(%(parent)s)
        from %(parent)s import %(child)s
    return %(child)s
"""
def my_import(partname, parent):
    f = None # for pychecker
    parentname = parent.__name__
    defn = GET_MODULE_FUNCTION % {"parent": parentname, "child": partname}
    #pr "executing"
    #pr defn
    try:
        exec(defn) # defines function f()
    except SyntaxError:
        raise ImportError, "bad function name "+repr(partname)+"?"
    partmodule = f()
    #pr "got", partmodule
    setattr(parent, partname, partmodule)
    #pr "setattr", parent, ".", partname, "=", getattr(parent, partname)
    return partmodule
Other suggestions welcome. I'm not happy about this...