V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
cheka
V2EX  ›  分享创造

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

  •  
  •   cheka · 2012-07-18 21:41:37 +08:00 · 21627 次点击
    这是一个创建于 4493 天前的主题,其中的信息可能已经有所发展或是发生改变。
    (这是打算写的这个系列 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  
       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   ·   实用小工具   ·   1242 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:22 · PVG 07:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.