后台程序模块化是软件工程中常见的设计思想,在软件开发中也很常见。可以解耦代码,尤其是同时面对多人的时候。开发或需要经常更改和升级。我们在windows中使用的普通dll就是模块化的一个例子。一个软件升级功能可能只需要升级部分dll文件即可。主题程序无需更改。例如,一些新的功能可以以模块的形式加载。方便开发者和用户。Python的动态加载模块是在python中,导入一个模块使用import模块名python会在sys.path中寻找名称匹配的文件(py,pyo,pyc,pyd,so,dll)等文件,我们可以在python中查找什么directory打印在sys.pathimportsyssys.path#返回以下内容['','/usr/lib64/python26.zip','/usr/lib64/python2.6','/usr/lib64/python2.6/plat-linux2','/usr/lib64/python2.6/lib-tk','/usr/lib64/python2.6/lib-old','/usr/lib64/python2.6/lib-dynload','/usr/lib64/python2.6/site-packages','/usr/lib64/python2.6/site-packages/gtk-2.0','/usr/lib/python2.6/site-packages','/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info']代码运行目录下的文件名也可以导入为模块名,比如有是一个名为tools.py的文件,直接在代码中导入这个文件名。导入后的模块将保存在sys.modules中。可以看到我们刚刚加载的tools.py,但是import只能加载固定名称的模块,不能加载字符串名称等动态模块,如str='tools'importstr#PrompterrorTraceback(mostrecentcallast):File"",line1,inImportError:Nomodulenamedstr这时候我们需要用到__import__,这是python的内建函数。import的底层其实就是用这个函数来加载模块的。我们可以看一下__import__#Returnstr='tools'__import__(str)#Return加载tools.py成功。现在动态加载任意模块的问题已经解决了,但是离成功还有一步之遥。在python中,加载模块是有缓存的,也就是说在加载tools.py之后,即使tools.py的内容发生变化,也不会重新加载,仍然不能满足我们在更新加载模块的需要即时的。这是在必要时重新加载模块的一种相对简单的方法。回想一下我们之前说过python加载的模块是存放在sys.modules中的。我们只需要在重新加载模块之前重新加载模块,从sys.modules中删除即可。delsys.modules['tools']__import__('tools')使用了python等特性。我们在写代码的时候,可以把经常变化的去掉,变成一个python模块。必要时,动态更新并重新加载到主程序中,完全可以实现不间断的服务升级。【本文为栏目组织“锐江云EflyCloud”作者原创文章,转载请联系原作者】点此阅读更多该作者好文
