数据库

人生苦短 我用Python [0x01] 动态加载模块

时间:2010-12-5 17:23:32  作者:系统运维   来源:应用开发  查看:  评论:0
内容摘要:背景程序模块化是软件工程里面一个常见的设计思想,在软件开发也比较常见,可以把代码解耦,特别是在面对多人同时开发或者需要经常变动升级。我们使用windows常见的dll就是模块化的一个例子,一个软件升级

背景

程序模块化是人生软件工程里面一个常见的设计思想,在软件开发也比较常见,苦短可以把代码解耦,动态特别是加载在面对多人同时开发或者需要经常变动升级。我们使用windows常见的模块dll就是模块化的一个例子,一个软件升级功能,人生可能就只需要升级一些dll文件就可以了,苦短主题程序不用改动,动态又比如一些新功能可以用模块的加载方式加载等,不仅有利于开发者还方便了使用者。模块

python的人生动态加载模块

在python里面,导入一个模块使用的苦短是

import 模块名 

python会在sys.path里面寻找匹配名称的文件(py, pyo, pyc, pyd, so, dll)等文件,我们可以在python里面打印sys.path是动态些什么目录

import sys sys.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的加载文件,服务器托管直接在代码里面import这个文件名导入。模块import之后的模块会保存在sys.modules里面

我们可以看到我们刚才加载的tools.py

但是import只能够加载固定名称模块,不能加载动态比如字符串名称模块,比如

str = tools import str #提示错误 Traceback (most recent call last):   File "", line 1, in  ImportError: No module named str 

这个时候,我们需要用到__import__,这是一个python的内置函数,import底层其实也是使用了这个函数加载模块的,我们可以看看

__import__ #返回 str = tools __import__(str) #返回加载tools.py成功 

好了,现在解决了动态加载随意模块的问题了,但是距离成功还有一步之遥,在python里面,加载模块是有缓存的,意思就是说,加载tools.py之后,就算tools.py内容发生改变了,云南idc服务商都不会重新加载,还是无法满足我们实时更新加载模块的需求。这里有个比较简单的办法,可以使得模块有需要的时候重新加载,回想之前我们说过,python加载后的模块都回保存在sys.modules里面,我们只需要再重新加载模块之前,把模块从sys.modules里面删除即可。

del sys.modules[tools] __import__(tools) 

使用python这样的特性,我们写代码的时候,就可以把经常需要变动的剥离出来成为一个python模块,需要的时候动态更新然后重新加载到主程序里面,可以***实现不中断服务升级。

【本文是专栏机构作者“睿江云EflyCloud”的原创文章,转载请联系原作者】

戳这里,看该作者更多好文

高防服务器
copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap