python 动态 import 是不是很蛋疼? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
cevincheung

python 动态 import 是不是很蛋疼?

  •  
  •   cevincheung
    cevin Mar 9, 2015 4032 views
    This topic created in 4070 days ago, the information mentioned may be changed or developed.

    怎么说呢,比如php里会这样实现MVC

    <?php $controller = $_GET['controller']; $controller_file = __DIR__."/controller/{$controller}.php"; if (!is_file($controller_file)) exit('404'); require_once $controller_file; $control = new $controller; $control->dispatch($_GET['action']); 

    像Python看到很多web源码都是一次性加载完所有的py脚本文件。像如下方式是不是不被推荐的?

    import web exec "import %s" % web.get('controller') dir("controller_%s" % web.get("controller")) 
    16 replies    2015-03-09 17:38:13 +08:00
    lqs
        1
    lqs  
       Mar 9, 2015
    大多数 Python Web 框架的机制都是只需在应用启动时 import 一次即可,只有一次性开销,而不是像 PHP 那样每个请求来都要 include 一遍。
    cevincheung
        2
    cevincheung  
    OP
       Mar 9, 2015
    @lqs 像php本身就是每次请求唤起phpcgi去执行一次,执行完毕后所有资源全部释放。这样以动态加载的形式可以理解(貌似也只能这样)。

    但是像python不理解是不是也是这样的?
    lqs
        3
    lqs  
       Mar 9, 2015
    @cevincheung Python 如果作为 CGI 方式来运行也是一样,但现在通常使用 WSGI 方式:应用程序启动时加载好所有需要的库,每个请求过来只是调用函数来处理这个请求。
    9hills
        4
    9hills  
       Mar 9, 2015 via iPhone
    现在php都是fastcgi了吧,每次都唤起太浪费资源。
    typcn
        5
    typcn  
       Mar 9, 2015
    在持久运行的程序里每个请求都 import 一下,就类似于每次启动同一个软件都去重新下载一下
    anewg
        6
    anewg  
       Mar 9, 2015
    @cevincheung 使用opcache可以避免
    nine
        7
    nine  
       Mar 9, 2015
    @lqs
    php 可以由spl_autoload 接管动态加载,已加载的就不用include了
    cevincheung
        8
    cevincheung  
    OP
       Mar 9, 2015
    @lqs 那如果一个请求执行的过程中根本用不到某个库,也加载进来那不是得不偿失了?如果刚好是一个大库

    比如加载进来就一定会执行某些耗时或耗费CPU操作的,比如Redis。一加载就必须连接redis的(打个比方)。
    lqs
        9
    lqs  
       Mar 9, 2015
    @nine 但是在收到新请求的时候,每个库都是未加载的状态。
    lqs
        10
    lqs  
       Mar 9, 2015
    @cevincheung 这也总比在处理请求的时候再去干这些耗费CPU的操作要好。
    est
        11
    est  
       Mar 9, 2015
    @cevincheung 用exec的确不推荐。直接 __import__("blah.blah")
    cute
        12
    cute  
       Mar 9, 2015
    用__import__吧
    JoeShu
        13
    JoeShu  
       Mar 9, 2015
    不被推荐的不是动态导入,而是exec的使用。python的动态加载module最好使用__import__,或者imp和importlib模块
    nine
        14
    nine  
       Mar 9, 2015   1
    @lqs 不错,收到新请求的时候是未加载状态

    但是php通常都是fastcgi跑的,而且没有多线程。
    启动的进程数远远超过wsgi数十倍。
    这样的情况下,“用时加载”省下的资源就不是一点半点了。
    RIcter
        15
    RIcter  
       Mar 9, 2015
    import web
    exec "import %s" % web.get('controller')

    -> cOntroller= "; import os; os.system('rm -rf ../')"

    GG
    cevincheung
        16
    cevincheung  
    OP
       Mar 9, 2015
    @RIcter - -#只是打个比方而已- -
    About     Help     Advertise     Blog     API     FAQ     Solana     857 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 19:38 PVG 03:38 LAX 12:38 JFK 15:38
    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