[mod_python] Module importing solution (?)

durumdara durumdara at gmail.com
Mon Dec 11 04:28:59 EST 2006


Skipped content of type multipart/alternative-------------- next part --------------
import os, sys
from threading import Lock

_ImportLock = Lock()
_Modules = {}

def Import(ModPath):
    ModPath = os.path.abspath(ModPath)
    _ImportLock.acquire(1)
    try:
        if not os.path.exists(ModPath):
            raise Exception, 'Module named "%s" does not exists!' % ModPath
        modinfo = _Modules.get(ModPath, None)
        needreload = (not modinfo)
        actmodtime = os.path.getmtime(ModPath)
        if modinfo:
            modtime, module = modinfo
            needreload = (actmodtime != modtime)
        if not needreload:
            return module
        mpath, mfn = os.path.split(ModPath)
        mf, me = os.path.splitext(mfn)
        import imp
        imp.acquire_lock( )
        try:
            afile, apathname, adescription = imp.find_module(mf, [mpath])
            module = imp.load_module(mf, afile, ModPath, adescription)
            del(sys.modules[mf])
        finally:
            imp.release_lock()
        _Modules[ModPath] = [actmodtime, module]
        return module
    finally:
        _ImportLock.release()


#print os.path.abspath('./t1/index.py')
#import sys
#sys.exit()
modtext = '''
name = %s
def PrintInfo():
    print "File:", __file__
    print "Name var:", name

'''
moddatas = []

def WriteIndexPy(Number, VarValue):
    spath = './subdir%03d' % Number
    if not os.path.exists(spath):
        os.makedirs(spath)
    sfn = os.path.join(spath, 'index.py')
    pytext = modtext % VarValue
    f = open(sfn, 'w')
    f.write(pytext)
    f.close()

print "Creating modules"
for i in range(100):
    WriteIndexPy(i, i)

print "Import new modules"
import time
st = time.time()
for i in range(100):
    spath = './subdir%03d' % i
    sfn = os.path.join(spath, 'index.py')
    m = Import(sfn)
    #print "Module:", m
    #print "Module's var", m.name
    #m.PrintInfo()
et = time.time()
print et - st, "seconds"

print "Import loaded modules"
import time
st = time.time()
for i in range(100):
    spath = './subdir%03d' % i
    sfn = os.path.join(spath, 'index.py')
    m = Import(sfn)
    #print "Module:", m
    #print "Module's var", m.name
    #m.PrintInfo()
et = time.time()
print et - st, "seconds"

time.sleep(1)
print "Reload 1"
spath = './subdir%03d' % 0
sfn = os.path.join(spath, 'index.py')
WriteIndexPy(0,100)
m = Import(sfn)
print "Module:", m
print "Module's var", m.name
m.PrintInfo()

print "Reload 2"
m = Import(sfn)
print "Module:", m
print "Module's var", m.name
m.PrintInfo()

print "Exec test"
import time
st = time.time()
for i in range(100):
    spath = './subdir%03d' % i
    sfn = os.path.join(spath, 'index.py')
    execfile(sfn, globals(), locals())
et = time.time()
print et - st, "seconds"

-------------- next part --------------
import os, sys
from threading import Lock

_ImportLock = Lock()
_Modules = {}

def Import(ModPath):
    ModPath = os.path.abspath(ModPath)
    _ImportLock.acquire(1)
    try:
        if not os.path.exists(ModPath):
            raise Exception, 'Module named "%s" does not exists!' % ModPath
        modinfo = _Modules.get(ModPath, None)
        needreload = (not modinfo)
        actmodtime = os.path.getmtime(ModPath)
        if modinfo:
            modtime, module = modinfo
            needreload = (actmodtime != modtime)
        if not needreload:
            return module
        orgsyspath = sys.path[:]
        try:
            mpath, mfile = os.path.split(ModPath)
            mfn, mfe = os.path.splitext(mfile)
            for apath in orgsyspath:
                amodpath = os.path.join(apath, mfile)
                if os.path.exists(amodpath):
                    sys.path.remove(apath)
            sys.path.append(mpath)
            if sys.modules.has_key(mfn):
                del(sys.modules[mfn])
            module = __import__(mfn)
            sys.path.remove(mpath)
            del(sys.modules[mfn])
            _Modules[ModPath] = [actmodtime, module]
            return module
        finally:
            sys.path = orgsyspath[:]
    finally:
        _ImportLock.release()


#print os.path.abspath('./t1/index.py')
#import sys
#sys.exit()
modtext = '''
name = %s
def PrintInfo():
    print "File:", __file__
    print "Name var:", name
    
'''
moddatas = []
for i in range(100):
    spath = './subdir%03d' % i
    if not os.path.exists(spath):
        os.makedirs(spath)
    sfn = os.path.join(spath, 'index.py')
    pytext = modtext % i
    open(sfn, 'w').write(pytext)
import gc
gc.collect()
import time
st = time.time()
for i in range(100):
    spath = './subdir%03d' % i
    sfn = os.path.join(spath, 'index.py')
    m = Import(sfn)
    #moddatas.append([m, m.name])
    #print "Module:", m
    #print "Module's var", m.name
    #m.PrintInfo()
et = time.time()
print et - st, "seconds"

'''
m1 = Import('./t1/index.py')
print m1.name
m2 = Import('./t2/index.py')
print m2.name
m2a = Import('./t2/index.py')
print m2a.name
'''
-------------- next part --------------
#import sys
#print sys.modules
#print "mod1"
#print globals()
#print locals()
#print a
#
#a  = 2

def main(RO):
    x
    
-------------- next part --------------
import os, sys

a =  {'a' : 1}
#locals()
#print sys.modules.keys()
execfile('execmod1.py', a)
print a['a']


More information about the Mod_python mailing list