#coding=utf-8
def add_attr(obj):
obj['a'] = 'a'
add_attrB.py的内容
#coding=utf-8
def add_attr(obj):
obj['b'] = 'b'
main.py
#coding=utf-8
import add_attrA
import add_attrB
obj = {}
def add_attr():
add_attrA.add_attr(obj)
add_attrB.add_attr(obj)
add_attr()
print obj

在main脚本里,要导入两个模块,如果后来又增加了一个add_attrC.py这个脚本,就不得不修改main.py的内容,增加一行代码 import add_attrC

那么,能不能不在main.py里这样费力的导入模块呢,毕竟每次新增一个add_attr脚本,都要需改main。

2、 __import__

__import__ 是python的内置函数,import 就是用它工作的,想要实现动态加载,可以通过__import__来实现

修改main.py代码

#coding=utf-8
import os,glob
obj = {}
files = glob.glob('add_attr*.py')
for filename in files:
module_name,ext = os.path.splitext(os.path.basename(filename))
moudle = __import__(module_name)
moudle.add_attr(obj)
print obj

模块的加载,不需要事先知道有多少个模块,如果新增一个add_attrC.py 文件,main脚本可以自动加载使用。

有一处需要特别说明,这样的加载方式只能加载main.py所在的文件夹下的模块,如果这些模块不和main.py在同一个目录下,刚才的这段代码就不能正确执行了,必须使用

sys.path.append 将目标目录添加到python的搜索路径中,这样就可以正常工作了

sys.path是一个list,里面存放的是python的搜索目录。