#!/usr/bin/env python
import os
import sys
import inspect
def load_modules_from_path(path):
"""
Import all modules from the given directory
"""
# Check and fix the path
if path[-1:] != '/':
path += '/'
# Get a list of files in the directory, if the directory exists
if not os.path.exists(path):
raise OSError("Directory does not exist: %s" % path)
# Add path to the system path
sys.path.append(path)
# Load all the files in path
for f in os.listdir(path):
# Ignore anything that isn't a .py file
if len(f) > 3 and f[-3:] == '.py':
modname = f[:-3]
# Import the module
__import__(modname, globals(), locals(), ['*'])
def load_class_from_name(fqcn):
# Break apart fqcn to get module and classname
paths = fqcn.split('.')
modulename = '.'.join(paths[:-1])
classname = paths[-1]
# Import the module
__import__(modulename, globals(), locals(), ['*'])
# Get the class
cls = getattr(sys.modules[modulename], classname)
# Check cls
if not inspect.isclass(cls):
raise TypeError("%s is not a class" % fqcn)
# Return class
return cls
def main():
load_modules_from_path('modules')
# load the TestClass1
class_name = load_class_from_name('class1.TestClass1')
# instantiate the Testclass1
obj = class_name()
# using this object obj to call the attributes inside the class
print obj.testclass1()
if __name__ == '__main__': main()
在 modules 目录中,我还有另外两个用于测试的模块:
[♫ test] modules :~ pwd
/tmp/dynamic_loader/modules
[♫ test] modules :~ ls -lR
total 32
-rw-r--r-- 1 staff staff 138 Aug 30 21:10 class1.py
-rw-r--r-- 1 staff staff 575 Aug 30 21:11 class1.pyc
-rw-r--r-- 1 staff staff 139 Aug 30 21:11 class2.py
-rw-r--r-- 1 staff staff 576 Aug 30 21:11 class2.pyc
[♫ test] modules cat class1.py
class TestClass1(object):
def testclass1(self):
print 'I am from testclass1'
def some_function():
print 'some function 1'