关于动态替换 import 内容的功能 - 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
zeromovie
V2EX    Python

关于动态替换 import 内容的功能

  •  
  •   zeromovie 2024-03-18 16:08:28 +08:00 2458 次点击
    这是一个创建于 640 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我写了一个基于 pytorch 的算法应用,现在考虑做一个功能,就是允许用户上传不同版本的 pytorch (源码或者安装包之类的),然后我在用户上传的这个版本的基础上进行 import 等操作,基于该版本的 pytorch 运行我自己写的算法应用,整个操作要求是不需要后台手动替换或者手动安装,完全自动化,这个有可能做到吗?假设先不考虑不同版本之间的依赖和兼容性问题

    15 条回复    2024-03-25 15:03:39 +08:00
    chf007
        1
    chf007  
       2024-03-18 16:14:22 +08:00
    Python 不是那种基于虚拟机的语言,动态换代码难
    aloxaf
        2
    aloxaf  
       2024-03-18 16:17:14 +08:00
    不怕用户上传个挖矿程序上去吗
    mightybruce
        3
    mightybruce  
       2024-03-18 16:21:14 +08:00
    可以做到,但是这简直就是可以直接攻击的点,最好还是不要干。
    这个叫做 self modifying script
    uliah
        4
    uliah  
       2024-03-18 16:24:10 +08:00
    从项目的角度有两种常用的做法:
    1 、将 pytorch 部分开发成独立应用, 通过 HTTP 暴露
    2 、运行多个版本的 pytorch 容器
    3 、main 进入后, 查询支持的 pytorch 版本, 选择后调用

    1 、编写一个 DOCKERFILE & deploy 模板
    2 、main 进入后, 填写 version 发布任务
    3 、任务 BUILD 后运行, 返回结果
    qazwsxkevin
        5
    qazwsxkevin  
       2024-03-18 16:27:00 +08:00
    importlib.import_module 是重载模块代码的,你这个情况应该适用
    momo1999
        6
    momo1999  
       2024-03-18 16:35:31 +08:00
    你要找的是不是 importlib
    cc666
        7
    cc666  
       2024-03-18 17:21:49 +08:00
    importlib.reload() 可以动态更新模块

    但是依赖于被更新模块的模块不会自动被更新,挺麻烦,可以试试 ipython 的%autoreload ,但还是有坑( from module import something ),没研究过是怎么实现的

    这个需求挺奇怪的,为什么不用多进程或者重启进程,大不了 subprocess 跑一个 python 脚本
    nevermoreluo
        8
    nevermoreluo  
       2024-03-18 17:31:34 +08:00
    总的来说完全切出去用进程间通信管道或者网络之类的都可以,这样风险低很多,不然要考虑的太多心智负担太重

    如果真的要做
    代码里面首先不能有全局变量之类的声明,这些声明的空间是另外开辟的 你要想好覆盖会不会发生异常情况
    其次原理上就是把 import 的 cache 删了 再 reload
    但是这时候内存中已经实例化的对象是不变的,如果这是你想要的就叫 feature ,如果不是 祝你幸福
    顶多加载到静态类方法能执行到新的
    Hstar
        9
    Hstar  
       2024-03-18 17:39:35 +08:00
    为什么纠结于替换 pytorch 库,这过程中不可控因素太多啦。
    工程化一点的做法应该是直接按照新的 pytorch 生成一个 python 虚拟环境或者容器。按这个思路来的话现成的解法就太多了。
    ipwx
        10
    ipwx  
       2024-03-18 17:46:14 +08:00
    docker run my-python-torch-xxx
    zeromovie
        11
    zeromovie  
    OP
       2024-03-18 18:54:08 +08:00
    感谢大家的回复,主要是有个测试类似框架的需求,可能看起来挺奇怪吧
    ClericPy
        12
    ClericPy  
       2024-03-18 19:28:19 +08:00
    1. importlib
    2. sys.modules.pop

    具体自己查
    tomczhen
        13
    tomczhen  
       2024-03-18 23:03:38 +08:00
    我的理解,启动脚本中增加 pythonpath 给到上传的包路径即可。这样自动化起来很容易。攻击问题就自行解决吧。
    LemonPrefect
        14
    LemonPrefect  
       2024-03-19 09:40:25 +08:00 via Android
    为所有版本构建 docker 容器然后要什么版本启动什么版本?
    founddev
        15
    founddev  
       2024-03-25 15:03:39 +08:00
    可以 from importlib import import_module
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3828 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 71ms UTC 05:26 PVG 13:26 LAX 21:26 JFK 00:26
    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