不重启程序使用最新版package
相信很多使用python者都对reload方法比较熟悉了,通过不间断地reload可以实现某一module的热更新,主要就能在不重启应用的情况下实现部分模块的更新。但这种方法仅限于reload当前工作目录下的module,对于通过setuptools安装的egg包就不灵了,具体分析如下:
(1)python 的import或者reload都是根据sys.path来进行查找相关module的,找到第一个匹配的module之后就进行加载然后退出此操作
(2)sys.path是有一定的顺序的
(3)通过setuptools 的easy_install进行安装的package,每个版本都保留在site-packages中
(4)sys.path正常情况下只有在python进程启动的时候进行赋值
(5)通过easy_install进行安装后easy_install.pth中记录的已经是最新版的package,但如果此时没有重启python进程,则sys.path中记录的还是原有的package位置,这时reload的话首先找到的还是老版本的package,也就是说新版并未生效
怎么解决这一问题?怎么在不重启程序的情况下使用新版的package?
通过研究python代码可以知道,python在启动的时候会加载 site.py,site.py中有一个main()函数负责对sys.path进行赋值操作,为实现我们在不重启程序就能使用最新版package的目的,可以通过显式调用site.py中的main()函数来操作,具体代码如下:
# -*- coding: utf-8 -*- import sys
import site
import time
import os.path
import copy def reload_module(module_str):
'''
reload module
'''
paths_old = copy.deepcopy(sys.path)
# invoke site.main to get updated sys.path
site.main()
paths_new = copy.deepcopy(sys.path)
updated = []
# parse updated packages
for item in paths_new[len(paths_old):]:
_, egg_name = os.path.split(item)
# egg_name like this : requests-1.1.0-py2.7.egg
# parse real package name
if len(egg_name) > 0:
package_name = egg_name.split('-')[0]
updated.append(package_name)
# erase old version packages
sys.path = []
for item in paths_new[:len(paths_old)]:
_, egg_name = os.path.split(item)
if len(egg_name) > 0:
package_name = egg_name.split('-')[0]
if package_name in updated:
# a new version is already exists, so erase the old one
pass
else:
sys.path.append(item)
# append the updated
sys.path.extend(updated)
if sys.modules.has_key(module_str):
print 'need reload'
reload(sys.modules[module_str])
else:
print 'need import'
try:
exec 'import %s' %module_str
except Exception, e:
print e def main():
import requests
while True:
time.sleep(2)
reload_module('requests')
print requests.__version__ if __name__ == '__main__':
main()
如果在程序运行过程中安装了新版的requests,则程序运行结果如下所示:
C:\Users\JerryKwan\Desktop>python get_current_version.py
need reload
1.2.0
need reload
1.2.0
need reload
1.2.0
need reload
1.2.0
need reload
1.2.3
need reload
1.2.3
need reload
1.2.3
不重启程序使用最新版package的更多相关文章
- linux下通过脚本实现自动重启程序的方法
无论什么程序都不可能完美无缺,理论上,任何程序都有 Core Dump 的一天,正式运营的程序,尤其是服务器程序,一旦 Core Dump ,后果不堪设想,有过服务器开发经验的朋友,一定都经历过深夜美 ...
- 黄聪:C#使用Application.Restart重启程序出错解决办法
调用 Application.Restart重启程序出错 解决办法,就是给程序的.exe文件,加上下面的设置
- C# 程序修改config文件后,不重启程序刷新配置ConfigurationManager
基本共识: ConfigurationManager 自带缓存,且不支持 写入. 如果 通过 文本写入方式 修改 配置文件,程序 无法刷新加载 最新配置. PS. Web.config 除外:Web. ...
- golang 通过fsnotify监控文件,并通过文件变化重启程序
一.下载我们需要的包 > go get github.com/fsnotify/fsnotify 二.使用fsnotify监控文件 package main; import ( "gi ...
- 零停重启程序工具Huptime研究
目录 目录 1 1. 官网 1 2. 功能 1 3. 环境要求 2 4. 实现原理 2 5. SIGHUP信号处理 3 6. 重启线程 4 7. 重启目标程序 5 8. 系统调用钩子辅助 6 9. 被 ...
- 【转】Android 中处理崩溃异常并重启程序出现页面重叠的问题
原文地址:http://blog.csdn.net/jiang547860818/article/details/53641113 android开发中经常会遇到程序异常,而已常常会遇到一出现异常AP ...
- nw.js node-webkit基本程序结构与配置package.json配置说明
(一)基本程序结构 如上图,是一个nw程序的基本组织结构,在根目录下有package.json(程序的配置文件)和index.html(可以是任意名称,应用的启动页面):js/css/resource ...
- Winform读写App.config文件以及重启程序
//重启主程序 //System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Locatio ...
- 微信小程序基于最新版1.0开发者工具分享-小试牛刀(视频)+发布流程
第一章:小程序初级入门教程 小试牛刀[含视频] 视频地址:https://v.qq.com/x/page/i0554akzobq.html 这一章节中,我们尝试着写一个最简单的例子,包含 2 个静态页 ...
随机推荐
- jQuery对input select操作小结
//遍历option和添加.移除optionfunction changeShipMethod(shipping){ var len = $("select[@name=ISHIPTYPE] ...
- asp.net页面跳转sessionid会变
今天发现在一个Asp.net站点中, 同一次登录, 不停刷新页面或者页面跳转, 此时后台Session的SessionID总是变化的. 创建一个页面,添加一个button,后台代码非常简单,如下 ...
- iOS开发UI篇—APP主流UI框架结构
iOS开发UI篇—APP主流UI框架结构 一.简单示例 说明:使用APP主流UI框架结构完成简单的界面搭建 搭建页面效果: 二.搭建过程和 ...
- MVN使用随笔
001 创建项目 mvn archetype:generate -DgroupId=com.company.push.monitor -DartifactId=push-monitor -Darche ...
- 转: javascript实现全国城市三级联动菜单代码
<html> <head> <title>js全国城市三级联动菜单代码_B5教程网</title> <meta http-equiv=" ...
- c# mvc使用 npoi下载 excel
IWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); //添加一个sheet ISheet sheet1 = book.CreateShee ...
- Rhel6-piranha配置文档
系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.119 server19.example.com 192.168.12 ...
- Valid Sudoku
理解题目的意思后这题不难.扫描一遍数独输入并按照要求进行判断就可以了.提交了两次,第一次用了stl的set,第二次本来想借助位运算的,想想觉得有些操作略显麻烦,因此用整数数组代替.代码如下: 解法一: ...
- LNMP服务器虚拟主机管理lnmp
安装 系统需求: 需要2 GB硬盘剩余空间 安装步骤: 1.使用putty或类似的SSH工具登陆:登陆后运行:screen -S lnmp如果提示screen命令不存在可以执行:yum install ...
- TCP/IP 协议:IP 协议
首先来看一下IP协议在实际中的位置: 我们只关系流程,不关系当前具体的服务类型 1.IP协议概述 作用: 从上图或从应用层->运输层->网络层->链路层来看,IP协议属于网络层,也就 ...