【virtualenv】python
用Python开发时面临的一个大问题就是每一个项目须要的依赖包不一致。若是是包自己不同倒还好,若是不一样项目须要的是不一样版本的包的话就会很麻烦。若是采用统一的系统Python环境(这里先定义一下系统python环境,是指好比windows上安装Python的目录默认是C:\python27之类的目录下面的全部python相关内容,而linux由于自带python,就是指系统自带的那套python环境。好比第三方库都存储在/usr/lib/python2.7/site-packages下等等)开发,包也只有一套作不到按项目区分。linux
解决这个问题的办法就是采用虚拟环境进行开发和维护不一样的项目。所谓虚拟环境,其实就是说在系统Python环境以外另搭一套python环境,这套python环境可能借用一部分系统Python环境的内容,而自身补充另外一些。身处虚拟环境上下文中的程序将会按照虚拟环境给出的边界来运行。flask
创建和管理虚拟环境的简单工具就是virtualenv了。virtualenv在linux平台和windows平台上均可用,并且它会根据本身所在的具体平台来改变一些配置适应当前OS。bootstrap
安装virtualenv十分方便,只要pip install virtualenv便可。这代表virtualenv其实也是用python写成的一个包。但更加方便的地方在于,在pip安装过程当中会为咱们在系统的可执行文件目录下(linux的话就是/usr/bin下)为咱们设立一个virtualenv的可执行文件。也就是说在命令行直接键入virtualenv就能够了。下面将以linux(CentOS7)为基础,说明virtualenv的用法。windows
■ 基本使用app
在命令行键入virtualenv <虚拟环境目录名>就能够在当前位置生成一个虚拟环境的目录,虚拟环境的目录名也就是虚拟环境的名字。打开这个目录咱们能够看到主要有bin,include,lib等目录,其中重点关注一下bin和lib两个目录。bin目录下顾名思义放着一些可执行的二进制文件,进去以后能够看到除了python以及几个不一样名字的python软链以外, 还有pip和easy_install这俩。就知道了,虚拟环境生成时自带了pip和easy_install这两个重要的工具,方便后续环境的搭建。lib目录能够看到最下面有个site-packages目录的。这个目录固然就是一些第三方库的目录了,默认状况下生成的这个目录中是只带有一些基本的第三方包的。传说加上--system-site-packages做为参数能够把系统python环境中的第三方包完整地拷贝过来,可是试了一下并不行。(刚才试了一下,--no-site-packages和--system-site-packages的主要区别是在虚拟环境架设完毕后进行pip安装时,若是原本系统环境中存在了想要装的包,指定--no-site-packages的会把那个包复制到虚拟环境的lib中,后者则不会。但这也不绝对。。好比我想pip install flask flask-bootstrap的时候,装flask包时确实能体现这个区别,可是装flask-bootstrap的时候,不管用啥参数flask-bootstrap文件就是不被复制过来。。)python2.7
另外在目录下还能够看到一个activate文件。这个文件是进入虚拟环境的入口。键入source activate就能够看到命令行的提示符前面多出了一个小括号,括号中是虚拟环境的名字。进入虚拟环境以后,键入pip,python等命令时运行的就再也不是系统python环境中的那些命令了。用which python就能够看一下,显示的应该已经不是/usr/bin/python了。所以,在这个环境中(不管你在哪一个目录下),只要调用了python命令来运行脚本的话,那么它所用的第三方库等上下文就是虚拟环境的上下文了。因此在虚拟环境的lib目录下安装想要的第三方包,而后用这个虚拟环境的python启动程序,就可使这个程序或者项目处于一个相对独立封闭的环境中了。工具
说到安装,虚拟环境中自带了pip,也就是提示咱们能够用pip安装。并且pip安装方便的一点在于,若是你要安装的包已经存在于系统python环境中了,那么pip不会再去PyPI上面下载,而是直接从系统环境中复制过来就好,因此安装速度也大大提升。另外,用pip freeze > requirement.txt这个命令能够将虚拟环境上下文中的python包的要求和依赖固化到requirement.txt这个文件中。当程序进行迁移但环境没有迁移的时候,只要在新环境中键入pip install -r requirement.txt来一口气安装全部这些依赖便可。将虚拟环境和pip freeze两个东西结合起来用十分方便ui
■ 关于程序迁移的问题spa
项目开发过程当中,经常遇到的就是在开发环境开发完成以后上线生产环境,可是生产环境的python环境不必定和开发环境一致,引发不少麻烦。
此时用虚拟环境能够节省力气。好比生产环境上面装了virtualenv,那么就能够在合适的地方创建一个虚拟环境,而后activate进入这个虚拟环境以后根据开发环境中固化下来的requirement.txt在虚拟环境中pip install -r requirement.txt。一口气就能够把全部依赖包都装进去。而后进入虚拟环境,用虚拟环境python启动程序(或者直接经过路径调用虚拟环境目录下的bin/python来启动)就能够作到和开发环境同样了。
不过能这么作仍是比较好的状况,假如生产环境没网呢?这时得想另外办法。在有网的地方搭建一套虚拟环境而后pip install相关包而后再把那些文件复制过来不失为一个好办法,不过略显麻烦。另外一个办法是这样的:直接把开发环境的整个虚拟环境复制到生产环境上,若是复制过去以后的路径相比于开发环境有变化,那么能够改动一下activate中VIRTUAL_ENV这个即将被添加的环境变量为新目录,这样就能够保证source activate出来的虚拟环境仍然是保持虚拟环境而不是变成了系统环境。(其实看下activate的代码不难发现,所谓虚拟环境只是在source activate的时候增长了一点环境变量,包括把虚拟环境下bin目录添加到PATH中而且先于原先全部PATH,因此在键入python的时候调用的是虚拟环境的python了,其他一些环境变量也相似。deactivate就是把这些环境变量恢复原值。)而后在项目中添加一个启动脚本,这个脚本先进入虚拟环境而后调用python启动程序,一切就和开发环境同样了。
请注意:上面的迁移要成功有一个大前提,就是生产环境和开发环境的python版本要同样。。。若是在python2.7下开发,迁移到2.6上极可能就会报缺乏libpython2.7.so.1.0之类的错误。若是真的想要一站式解决这个问题,好比想把这个程序移植到没有python的环境中去,那么须要把整个python都安装过去。
■ windows下的virtualenv
windows下的virtualenv生成的虚拟环境的目录和linux下不太同样。主要区别在于bin目录被更名成Scripts目录且里面都是一些.exe文件包括activate。而后lib改叫Lib了。其余的好像倒也都相似
■ virtualenvwrapper
有空再补充吧。。