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

    我写了一个基于 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 是重载模块代码的,你这个情况应该适用
    shuax
        6
    shuax  
       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   ·   实用小工具   ·   3679 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:08 · PVG 08:08 · LAX 17:08 · JFK 20:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.