Python实践:模块自动重载
一、概述
开发Web程序时,通常会采用本地服务器进行调试,但如果代码有变动,就需要重启服务器。开发过程中修改代码是经常的事,不断地重启服务器既麻烦又耗时。因此为了避免这种笨拙的行为,在流行的Web框架中,都提供了 模块自动重载 的功能:不用重启服务器,自动重新加载有变动的模块。
自动 的方式有很多,具体跟Web框架的实现强相关。像web.py中就是通过每次处理请求时都尝试重载来模拟自动,而flask中则是使用独立线程来完成的。简单起见,本文的测试代码中采用while循环(独立进程)来实现自动。
二、思路
遍历已经加载的所有模块,查看每个模块的对应文件的最近修改时间,如果时间有变化,则重新加载该模块。
三、实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Reload modules if modified
usage:
python reloader.py [test_module_name]
"""
import sys
import os
mtimes = {}
def do_reload(handler=None):
"""Reload modules if modified
"""
for module in sys.modules.values():
# get filename
filename = getattr(module, '__file__', None)
if not (filename and os.path.isfile(filename)):
continue
# handle python file extensions
# for more details about this topic,
# see http://stackoverflow.com/questions/8822335/what-does-python-file-extensions-pyc-pyd-pyo-stand-for
if filename[-4:] in ('.pyc', '.pyo', '.pyd'):
filename = filename[:-1] # get the '.py' file
# get the time of most recent content modification
try:
mtime = os.stat(filename).st_mtime
except OSError:
continue
# reload `module` if it's modified
old_time = mtimes.get(module)
if old_time is None: # the first time in this function, just record mtime
mtimes[module] = mtime
elif old_time < mtime: # `module` is modified
try:
reload(module)
mtimes[module] = mtime
if handler: # call handler() if necessary
handler(module)
except ImportError:
pass
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.stderr.write(__doc__)
sys.exit(1)
test_module_name = sys.argv[1]
import importlib
try:
importlib.import_module(test_module_name)
except ImportError, e:
print(str(e))
sys.exit(1)
import time
def handler(module):
print(dir(module))
print('start reloading module `%s` automatically...' % test_module_name)
while True:
try:
do_reload(handler)
time.sleep(2)
except KeyboardInterrupt:
break
四、测试
1、开启自动重载(终端1)
$ touch testmod.py
$ python reloader.py testmod
start reloading module `testmod` automatically...
2、修改模块(终端2)
$ vi testmod.py
...
3、查看实时输出(终端1)
一旦对testmod.py有修改保存,终端1中会立即打印出模块testmod的当前所有属性。当然,也可以修改handler来实现其他的处理方式。
五、参考源码
Python实践:模块自动重载的更多相关文章
- Python实践:开篇
一.概述 Python实践 是应用Python解决实际问题的案例集合,这些案例中的Python应用通常 功能各异.大小不一. 该系列文章是本人应用Python的实践总结,会不定期更新. 二.目录 Py ...
- python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)
今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...
- 一文搞懂 Python 的模块和包,在实战中的最佳实践
最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...
- Day05 - Python 常用模块
1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...
- python 各模块
01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...
- 万恶之源 - Python 自定义模块
自定义模块 我们今天来学习一下自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块啊 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组 ...
- python常用模块collections os random sys
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...
- python email模块
python email模块 官方文档 email模块 电子邮件包是一个用于管理电子邮件消息的库.它的特殊设计不用于向SMTP (RFC 2821).NNTP或其他服务器发送任何电子邮件消息;这些是模 ...
- Python自定义模块
自定义模块 自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组织结构要好,代码不冗 ...
随机推荐
- javascript trigger触发事件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Sqlserver日期函数应用
1.获取当前时间 SELECT GETDATE() AS '当前日期' , DATENAME(year, GETDATE()) AS '年' , DATENAME(m ...
- HDOJ 2063 过山车
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Coursera台大机器学习课程笔记14 -- Validation
这节课是接着上节的正则化课程的,目的也是为了防止overfitting. 第一小节讲了模型的选择,前面讲了很多模型,那么如何做出正确的选择呢?我们的目标是选择最小的Eout目标函数.首先应避免视觉化选 ...
- jstack命令详解
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...
- operator new3种情况详解
[本文链接] http://www.cnblogs.com/hellogiser/p/operator-new.html [代码] C++ Code 12345678910111213141516 ...
- 【转】PowerDesigner使用方法小结
本文转自:http://www.cnblogs.com/afarmer/archive/2012/11/05/2755327.html PowerDesigner多用来进行数据库模型设计,具有SQL语 ...
- iOS 网络请求中的challenge
这里有一篇文章,请阅读,感谢作者!http://blog.csdn.net/kmyhy/article/details/7733619 当请求的网站有安全认证问题时,都需要通过 [[challenge ...
- web iphone css 兼容性
解决IPHONE网页兼容(部分字号变大): body{-webkit-text-size-adjust:none;}
- BaseServlet方法分发
BaseServlet.java package org.guangsoft.controller; import java.io.IOException; import java.lang.refl ...