这篇文章主要介绍了 python 如何重载模块实例解析, 涉及模块的概念, 载入和重载的实例, 小编觉得还是挺不错的, 具有一定借鉴价值, 需要的朋友可以参考下
本文首先介绍了 Python 中的模块的概念, 谈到了一个模块往往由多个模块组成, 然后通过具体实例, 分析了模块重载的相关内容, 具体介绍如下
模块是 Python 程序架构的一个核心概念, 较大的程序往往以多个模块文件的形式呈现, 一个模块被设计成主文件或顶层文件, 用来启动整个 Python 程序每个以. py 为后缀的 Python 源代码文件都是一个模块, 其他文件可通过导入读取这个模块的内容从一般意义上讲, 模块就是变量名的封装如写一个模块 test.py, 包含一个两个变量名 nameage
- name='Aidan'
- age=27
那么, 通过在 Python 命令行中执行下述命令
- import test
- print(test.name, test.age)
可以得到结果: Aidan 27
函数 dir(modelname)可以用来获取模块内部可用的变量名, 其中会包含一些 Python 内置的变量名如'__doc____file__'
一个 Python 程序往往由多个模块组成, 通过 import 连接每个模块文件都是一个命名空间, 看不到其他模块文件的变量名, 除非通过 import 导入了那个文件或者通过
from model import varible
导入某个变量这样就避免了变量命名的冲突, 因为每个模块都是独立的命名空间, 类似于 C 语言里一个个函数和其局部变量
从本质上, 导入就是在一个文件中载入另一个文件的内容, 从而使另一个文件能够被放在外部世界使用, 指令就是 import name.py 导入只在每次会话的第一次执行有效果, 后续再多次导入同一个文件时无效的, 即使文件发生了更改, 这是因为第一次导入时就将文件编译成了字节码导入模块必须知道模块的详细路径(文件搜索, 可通过 sys.path 中 PYTHONPATH 变量指明所有需要搜索的目录), 因此为了简单, 将所有需要导入的文件放在同一个目录
若想在同一次会话中多次运行同一个文件 (或文件发生改变必须重载), 那就需要调用重载函数 - reload(name), 调用 reload 函数前请确保已经通过 import 成功导入了该模块看清函数 reload() 和语句 import 的区别, reload()是一个函数参数就是已导入的文件模块文件名, import 是一个语句不需要括号 Python 的重载功能允许用户在交互过程中编辑并改进代码模块, 因此为了确保运行的是最新的代码, 首先使用 reload()
flask 在调试时, 如果我们对文件有所修改, 服务器就会重新启动, 而无需我们停下服务器再重新启动, 这里面就暗藏了一个重载的机制
下面用一个简单的例子, 来解释 python 如何重载一个模块
新建一个名为 reloadsetting.py 的文件, 内容很简单:
- #coding=utf-8
- '''''
- Created on 2016-3-25
- @author: Administrator
- '''msg ='change it '
再新建一个名称为 reloaddemo.py 的文件, 内容为:
- #coding=utf-8
- '''''
- Created on 2016-3-25
- @author: Administrator
- '''
- import threading
- import reloadsetting
- import sys,os, time
- def printworker():
- while True:
- time.sleep(1)
- print reloadsetting.msg
- def auto_reload():
- while True:
- mods = ["reloadsetting"] # the need reload modules
- for mod in mods:
- try:
- module = sys.modules[mod]
- except:
- continue
- #获得文件的名字
- filename = module.__file__
- #pyc 结尾的文件, 只在第一次载入时生成, 因此, 即便我们对文件进行了修改, 运行中, 它的修改时间是不会变的
- if filename.endswith(".pyc"):
- filename = filename.replace(".pyc", ".py")
- #获得文件上一次修改的时间
- mod_time = os.path.getmtime(filename)
- #module.__dict__ 里保存了模块的信息, 具体参考 globals 函数
- if not "loadtime" in module.__dict__:
- module.loadtime = 0 # first load's time 1*
- try:
- #如果修改时间大于上一次载入的时间, 那么就重新载入
- if mod_time > module.loadtime:
- reload(module)
- except:
- pass
- module.loadtime = mod_time
- time.sleep(1)
- if __name__ == '__main__':
- t_reload = threading.Thread(target=auto_reload)
- t_reload.start()
- t_reload2 = threading.Thread(target=printworker)
- t_reload2.start()
我们启动运行 reloaddemo.py , 一个线程不停的打印 reloadsetting 模块中的 msg, 一个线程不停的尝试重载 reloadsetting 模块在运行过程中, 修改 reloadsetting 模块中的 msg 的内容, 很快, 打印出来的内容也会随之发生变化, 你可能会担心, 如果在修改时不慎写错了代码, 比如把 msg 给删除掉了, 或者写成了 msg = , 而后面根本就没有赋值, 那重载岂不是就失败了么, 这种担忧是多余的, 即便模块 reloadsetting 中有错误, 那么在调用 reload 函数时, 也不会发生错误, 模块仍然是上一次有效 reload 后的状态, 不信, 你可以试一试
来源: http://www.phperz.com/article/18/0219/363240.html