博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
人生苦短我用python(02)动态加载模块
阅读量:5856 次
发布时间:2019-06-19

本文共 1875 字,大约阅读时间需要 6 分钟。

文章内容为原创,欢迎转载请注明出处

作者: EflyPro->晦明禅师

文章来源:公众号“睿江云计算”

继第一期【人生苦短我用Python系列专栏】发布后,深受广大睿普迷的一致好评,经常问小普第二期什么时候出呀?好期待~

来来来小普这就呈上第二期【02动态加载模块】
错过了第一期的小伙伴们可以点此穿越哦
【睿普专栏】人生苦短,我用Python

背景

程序模块化是软件工程里面一个常见的设计思想,在软件开发中也比较常见,可以把代码解耦,特别是在面对多人同时开发或者需要经常变动升级。我们使用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里面

import sys

import tools
tools
#返回下面内容
<module 'tools' from 'tools.py'>
#我们看看当前我们加载的模块
人生苦短我用python(02)动态加载模块

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

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

str = 'tools'

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

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

import

#返回
<built-in function import>
str = 'tools'
import(str)
#返回加载tools.py成功
<module 'tools' from 'tools.py'>

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

del sys.modules['tools']

import('tools')
<module 'tools' from 'tools.pyc'>

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

转载于:https://blog.51cto.com/13475644/2119223

你可能感兴趣的文章
(cons '(〇 . 前言) 《为自己写本-Guile-书》)
查看>>
JQuery tokeninput输入提示插件获取JSON数据
查看>>
一天一点linux(11):如何用U盘装Linux系统?
查看>>
Android动态设置控件长宽比的几种常见方法
查看>>
SegmentFault 高效改版,快来内测啦!
查看>>
docker学习系列13 实现 基于pxc 的mysql 多节点主主同步 ...
查看>>
Javascript操作DOM常用API总结
查看>>
Java图形化:布局方式
查看>>
DBA很忙—MySQL的性能优化及自动化运维实践
查看>>
通过调用笑话列表API获取笑话列表
查看>>
POI事件模式指北(三)- 读取Excel实战
查看>>
Java —— jdk环境变量搭建
查看>>
前端如何实现图片懒加载(lazyload) 提高用户体验
查看>>
光宇游戏CTO沈崴:《问道》“2019”年度数字大服为何选择阿里云!
查看>>
Java 工程师成神之路 | 2019正式版
查看>>
用条码标签打印软件批量打印物料标签
查看>>
Nginx 1.15.10 主线版发布,高性能 Web 服务器
查看>>
android 记一次解决键盘遮挡问题
查看>>
微服务设计指南
查看>>
使用rekit脚手架创建react项目
查看>>