Python 支持同时运行多版本模块 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xsank
V2EX    Python

Python 支持同时运行多版本模块

  •  
  •   xsank 2017-12-29 12:58:37 +08:00 3328 次点击
    这是一个创建于 2934 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 python 比较多的同学可能都遇到过 python 多版本的问题,其中又包括:

    1. python 自身多版本
    2. 应用依赖包多版本

    针对上面两点,目前已经有了比较成熟的解决方案,分别是 pyenv 和 virtualenv,对于本地开发或者线上部署都起到很方便的作用

    但是今天正巧碰到一个需求,在一个算法托管平台上,算法同学希望能支持同一算法包多版本同时运行,方便进行灰度比较并及时更新版本
    对于这种情况,pyenv 和 virtualenv 就显得心有余而力不足了
    最终决定自己开发搞了一个工具包,支持同一算法包的版本隔离及卸载,重新加载,大体用法如下:

    # 导入多版本模块 lib_1 = import_module("lib", version=1) lib_2 = import_module("lib", version=2) # 模块方法调用 lib_1.show() lib_2.show() # 列出此模块同时运行哪些版本 modules = list_all_version_of_module("lib") print(modules) # 卸载模块 unload_module("lib", 1) # 重新载入模块 lib_2 = reload_module("lib", 2) lib_2.show() # 卸载该模块所有版本 unload_all_module("lib") 

    本地已经试验通过了,而且项目代码只有百行左右
    在这里提供给大家参考,欢迎大家使用并提出建议

    代码地址:vimport

    6 条回复    2017-12-29 17:19:51 +08:00
    janxin
        1
    janxin  
       2017-12-29 14:39:02 +08:00
    用虚拟环境切分不能解决这个问题嘛?起两个进程实例对比
    renothing
        2
    renothing  
       2017-12-29 14:41:03 +08:00
    docker 不能解决你的需求么?还要去改代码
    tempdban
        3
    tempdban  
       2017-12-29 14:50:42 +08:00
    楼上谦虚点能死
    我现在用的是 openstack 的那套模块插拔机制
    okletswin
        4
    okletswin  
       2017-12-29 16:50:10 +08:00
    楼上的没看需求就评论,点开标题前我想了想,应该是一个会话里想使用一个模块的多个版本
    简单看了看源码,模块自身需要定义好版本目录结构,在协议好的环境中工作
    fengdra
        5
    fengdra  
       2017-12-29 16:50:44 +08:00 via Android
    @renothing 楼主应该是说同一进程下导入不同模块
    xsank
        6
    xsank  
    OP
       2017-12-29 17:19:51 +08:00
    感谢大家回复,我统一解释下:
    统一种问题有多种解法,需要定位用哪一种来解决更合理
    1. @janxin 虚拟环境切分当然可以,那么久意味着下次用户对包稍微调整下逻辑,你就得起一个独立的环境,对于频繁发布快速迭代你怎么处理?这是个很重的运维问题
    2. @renothing docker 也可以解决,但是用户还是会迭代包的,你可以统一打一个镜像,然后拉不同的包起进程,但本质仍是很重的部署问题,不但消耗资源,还强依赖调度器,又是一个运维问题

    @tempdban openstack 没有经验,欢迎贴出代码目录,大家一起学习下,感谢

    @okletswin @fengdra 是这样的,是在同一个进程中运行多个版本模块,这种需求需要定义一个指定目录,剩下的版本会有规范控制,对于频繁引入二方包的场景是很合适的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2814 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 08:11 PVG 16:11 LAX 00:11 JFK 03:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86