VirtualEnv 和Pip 构建Python的虚拟工作环境 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
cheka
V2EX    分享创造

VirtualEnv 和Pip 构建Python的虚拟工作环境

  •  
  •   cheka 2012-07-18 21:41:37 +08:00 22386 次点击
    这是一个创建于 4903 天前的主题,其中的信息可能已经有所发展或是发生改变。
    (这是打算写的这个系列 http://www.v2ex.com/t/33489 的第一篇,我不会太监,毕竟这些内容本来在公司内部或多或少就会有整理,不过工作本身忙,进度快慢不能保证,各位谅解)

    一般而言,所有python相关的包会装在系统目录里,譬如/usr/lib/ 或者/usr/local/lib/,这样的话,假设两个开发分支要求的库不一样,譬如对应在线版本的开发环境使用 Django1.3,但是一个新的开发分支基于Django1.4,两者就会互相影响。

    Virtualenv 是一个虚拟环境程序,可以把开发环境隔离。基本思想是建立不同的环境目录,其中装有独立的各类包,甚至也可以是独立的不同版本python程序。

    1. 安装 virtualenv 和 virtualenvwrapper,后者是一套很有用的扩展,提供了方便切换开发环境的快捷命令

    以下命令都是基于Ubuntu的(Mac OS 上可以参考 https://gist.github.com/1208841

    sudo pip install virtualenv
    sudo pip install virtualenvwrapper

    #2 在用户的home目录下创建一个名为product的虚拟环境

    export WORKON_HOME=~/envs
    mkdir $WORKON_HOME
    source /usr/local/bin/virtualenvwrapper.sh
    mkvirtualenv --no-site-packages product #--no-site-packages 参数代表所有的Python包都从虚拟环境里找,任何时候都不去例如/usr/lib/python/这类全局环境里查找

    这步完成后,就建立了一个名为product的虚拟环境目录,用workon product便能切换这个环境下,所谓切换,就是说这时候如果执行which python,就会发现现在的python不是/usr/bin/python,而是~/envs/product/bin/python,相应的所有的第三方python依赖也都在~/envs/product/lib/python2.7/site-packages/ 下。

    #3 为了偷懒,可以在bashrc里建立一个alias,譬如

    alias product='source ~/.bashrc; workon product; cd ~/envs/product/src'

    alias stage='source ~/.bashrc; workon stage; cd ~/envs/stage/src'

    这样执行product,stage就能分别切换到相应的虚拟工作环境,同时进入工作目录。

    #4 未来要装相应的库,直接用pip即可,但是要确保pip也是相应的虚拟环境里的,可以用which pip检查,譬如要装django,就可以用

    pip install django

    pip也可以列出当前虚拟环境里所有的依赖,可以用这个办法将所有这些依赖写入一个文件,例如

    pip freeze > product.dev

    如果在另外一个环境里要重新安装这些依赖,执行

    pip install -r product.dev

    即可
    14 条回复    1970-01-01 08:00:00 +08:00
    shitiven
        1
    shitiven  
       2012-07-19 11:07:53 +08:00
    貌似给搞复杂了哇,我们做法是把django的src直接仍在project的根目录下,如果是python版本不一样的话,就export 修改下pythonpath就好了
    ratazzi
        2
    ratazzi  
       2012-07-19 12:09:58 +08:00
    @shitiven 按照你的说法,如果依赖多个库怎么办,难道都扔项目目录吗
    c
        3
    c  
       2012-07-19 12:19:17 +08:00
    @cheka 扇贝 加油!
    shiny
        4
    shiny  
    PRO
       2012-07-19 12:21:00 +08:00
    Virtualenv + uwsgi + nginx,非常好用
    shitiven
        5
    shitiven  
       2012-07-19 12:49:31 +08:00
    @ratazzi 我说的是我这边的做法,就把所有的库都放到了项目下面的Library目录下,然后把路径加到pythonpath中,没有把库都global了,因为现在大多数开源库都放在github上了,所以有更新的时候就直接git pull 拉一下就好了。。 可能每个团队开发习惯不一样吧
    accesine
        6
    accesine  
       2012-07-19 13:05:47 +08:00
    最简单的一个问题:
    Virtualenv 如何 和 某个版本的 Python 关联起来的呢?
    比如:
    我需要:
    mkvirtualenv product # 使用 python version 2.7
    mkvirtualenv dev # 使用 python version 3.2

    如何做到呢?



    source /usr/local/bin/virtualenvwrapper.sh 你的 virtualenvwrapper.sh 里面是什么东东?


    请帮助,多谢。
    rexren
        7
    rexren  
       2012-07-19 15:42:59 +08:00   1
    virtualenv -p python2.7 product
    virtualenv -p python3.2 dev
    @accesine
    ratazzi
        8
    ratazzi  
       2012-07-19 16:08:12 +08:00
    @shitiven 习惯确实不太一样,不过我们会依赖一些需要编译的库,virtualenv 就比较有优势了
    reorx
        9
    reorx  
       2012-07-19 17:24:09 +08:00
    既然都使用 virtualenv 了,为何不自己编译安装 Python,再在其上安装 virtualenv 呢,这样 Python 环境就真正不受任何外界因素(包括系统对某些 Python 库的依赖)的影响了。
    cheka
        10
    cheka  
    OP
       2012-07-19 17:33:43 +08:00
    @shitiven
    直接把依赖代码塞项目目录下有不少弊病,譬如:

    1. 项目目录下会有很多第三方代码库,譬如我们项目依赖近80个第三方库;
    2. 工作环境复制会依赖文件拷贝,但是到了每个人手上,这些依赖就不好控制,有人会升级到最新版本,有人会用其他fork的版本,导致一旦出现问题难以查找;

    另外,用virtualenv+uwsgi+nginx 还有额外好处,譬如同一台机器上可以建立几个virtualenv,里面可以有不同的依赖甚至代码分支,响应不同的端口号,这样一台机器就能同时提供生产环境和测试环境,在没有足够物理服务器或者不想折腾虚拟机的情况下,是个比较简单的方案。
    shitiven
        11
    shitiven  
       2012-07-19 18:07:38 +08:00
    @cheka 是的,库多了就比较麻烦,所以最近在改进,正在写个脚本模拟npm install(nodejs)类似的安装方式,开发人员有需要的库只要改下配置文件就好,然后执行一个脚本安装就好,类库是不提交到代码内的.... 这样项目在任何环境移植类库都可以一键下载...

    virtualenv我们也试着看看,看着也挺好玩的
    cheka
        12
    cheka  
    OP
       2012-07-19 18:11:03 +08:00
    @shitven,好吧,你们这么做去没准就是实现了一个pip,哈哈
    shitiven
        13
    shitiven  
       2012-07-19 18:19:03 +08:00
    @cheka 哈哈,那没有的,virtualenv还是挺省事的,只是平时爱折腾
    alswl
        14
    alswl  
       2012-07-20 22:39:22 +08:00   1
    扇贝啊,哈哈,又看到了,感谢分享。
    virtualenv + virtualenvwrapper 神奇啊。
    在 $HOME/.virtualenv/ 自动管理多个环境,使用 workon 命令即可轻松切换。
    类似于 bundle + rvm。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2500 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 10:59 PVG 18:59 LAX 02:59 JFK 05:59
    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