人生苦短 我用Python [0x01] 动态加载模块
创始人
2025-02-13 10:21:24
0次

背景

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

python的动态加载模块

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

  1. import 模块名 

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

  1. import sys 
  2. sys.path 
  3. #返回下面内容 
  4. ['', '/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只能够加载固定名称模块,不能加载动态比如字符串名称模块,比如

  1. str = 'tools' 
  2. import str 
  3. #提示错误 
  4. Traceback (most recent call last): 
  5.   File "", line 1, in  
  6. ImportError: No module named str 

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

  1. __import__ 
  2. #返回 
  3.  
  4. str = 'tools' 
  5. __import__(str) 
  6. #返回加载tools.py成功 

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

  1. del sys.modules['tools'] 
  2. __import__('tools') 

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

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

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

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...