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 · 2879 次点击
    这是一个创建于 2548 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 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   ·   实用小工具   ·   2560 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:22 · PVG 12:22 · LAX 20:22 · JFK 23:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.