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

2012-07-18 21:41:37 +08:00
 cheka
(这是打算写的这个系列 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

即可
21645 次点击
所在节点    分享创造
14 条回复
shitiven
2012-07-19 11:07:53 +08:00
貌似给搞复杂了哇,我们做法是把django的src直接仍在project的根目录下,如果是python版本不一样的话,就export 修改下pythonpath就好了
ratazzi
2012-07-19 12:09:58 +08:00
@shitiven 按照你的说法,如果依赖多个库怎么办,难道都扔项目目录吗
c
2012-07-19 12:19:17 +08:00
@cheka 扇贝 加油!
shiny
2012-07-19 12:21:00 +08:00
Virtualenv + uwsgi + nginx,非常好用
shitiven
2012-07-19 12:49:31 +08:00
@ratazzi 我说的是我这边的做法,就把所有的库都放到了项目下面的Library目录下,然后把路径加到pythonpath中,没有把库都global了,因为现在大多数开源库都放在github上了,所以有更新的时候就直接git pull 拉一下就好了。。 可能每个团队开发习惯不一样吧
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
2012-07-19 15:42:59 +08:00
virtualenv -p python2.7 product
virtualenv -p python3.2 dev
@accesine
ratazzi
2012-07-19 16:08:12 +08:00
@shitiven 习惯确实不太一样,不过我们会依赖一些需要编译的库,virtualenv 就比较有优势了
reorx
2012-07-19 17:24:09 +08:00
既然都使用 virtualenv 了,为何不自己编译安装 Python,再在其上安装 virtualenv 呢,这样 Python 环境就真正不受任何外界因素(包括系统对某些 Python 库的依赖)的影响了。
cheka
2012-07-19 17:33:43 +08:00
@shitiven
直接把依赖代码塞项目目录下有不少弊病,譬如:

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

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

virtualenv我们也试着看看,看着也挺好玩的
cheka
2012-07-19 18:11:03 +08:00
@shitven,好吧,你们这么做下去没准就是实现了一个pip,哈哈
shitiven
2012-07-19 18:19:03 +08:00
@cheka 哈哈,那没有的,virtualenv还是挺省事的,只是平时爱折腾
alswl
2012-07-20 22:39:22 +08:00
扇贝啊,哈哈,又看到了,感谢分享。
virtualenv + virtualenvwrapper 神奇啊。
在 $HOME/.virtualenv/ 自动管理多个环境,使用 workon 命令即可轻松切换。
类似于 bundle + rvm。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/42760

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX