什么是virtualenv?
在Python的开发环境的最常用的方法是使用 virtualenv 包。 Virtualenv是一个用来创建独立的Python环境的包。现在,出现了这样的问题:为什么我们需要一个独立的Python环境? 要回答这个问题,请允许我引用virtualenv自己的文档:
virtualenv is a tool to create isolated Python environments.
The basic problem being addressed is one of dependencies and versions, and indirectly permissions. Imagine you have an application that needs version 1 of LibFoo, but another application requires version 2. How can you use both these applications? If you install everything into /usr/lib/python2.7/site-packages (or whatever your platform’s standard location is), it’s easy to end up in a situation where you unintentionally upgrade an application that shouldn’t be upgraded.
Or more generally, what if you want to install an application and leave it be? If an application works, any change in its libraries or the versions of those libraries can break the application.
Also, what if you can’t install packages into the global site-packages directory? For instance, on a shared host.
In all these cases, virtualenv can help you. It creates an environment that has its own installation directories, that doesn’t share libraries with other virtualenv environments (and optionally doesn’t access the globally installed libraries either).
我们需要处理的基本问题是包的依赖、版本和间接权限问题。想象一下,你有两个应用,一个应用需要libfoo的版本1,而另一应用需要版本2。如何才能同时使用这些应用程序?如果您安装到的/usr/lib/python2.7/site-packages(或任何平台的标准位置)的一切,在这种情况下,您可能会不小心升级不应该升级的应用程序。
简单地说,你可以为每个项目建立不同的/独立的Python环境,你将为每个项目安装所有需要的软件包到它们各自独立的环境中。
安装与使用virtualenv
安装 virtualenv 很简单:
1 | pip install virtualenv |
virtualenv安装完毕后,可以通过运行下面的命令来为你的项目创建独立的python环境:
1 | mkdir nowamagic_venv |
2 | virtualenv --distribute nowamagic_venv |
OK,成功。上面发生了什么?你创建了文件夹 nowamagic_venv 来存储你的新的独立Python环境。 这个文件夹位于 /root 下面。
我们再来看看输出:
1 | New python executable in nowamagic_venv/bin/python2.7 |
2 | Also creating executable in nowamagic_venv/bin/python |
3 | Installing Setuptools...... done . |
4 | Installing Pip........... done . |
--distribute 选项使virtualenv使用新的基于发行版的包管理系统而不是 setuptools 获得的包。 你现在需要知道的就是 --distribute 选项会自动在新的虚拟环境中安装 pip ,这样就不需要手动安装了。 当你成为一个更有经验的Python开发者,你就会明白其中细节。

- activate:这个virtualenv的激活文件
- pip:这个virtualenv的独立pip
- python:python解释器的一个副本
- lib/python2.7:所有的新包会被存在这
试验一下
通过下面的命令激活这个virtualenv:
1 | [root@nowamagic ~] # cd nowamagic_venv |
2 | [root@nowamagic nowamagic_venv] # source bin/activate |
3 | (nowamagic_venv)[root@nowamagic nowamagic_venv] # |
运行下面的命令可以更好地理解两者的差异,如果已经进入virtualenv请先离开。
1 | deactivate #离开 |
首先让我们看看如果调用python/pip命令它会调用那一个。
1 | [root@nowamagic ~] # which python |
2 | /usr/bin/python |
1 | [root@nowamagic ~] # which pip |
2 | /usr/ local /bin/pip |
再来一次!这次打开virtualenv,然后看看有什么不同。我的机子上显示如下:
1 | [root@nowamagic ~] # which python |
2 | /root/nowamagic_venv/bin/python |
1 | [root@nowamagic ~] # which pip |
2 | /root/nowamagic_venv/bin/pip |
virtualenv拷贝了Python可执行文件的副本,并创建一些有用的脚本和安装了项目需要的软件包,你可以在项目的整个生命周期中安装/升级/删除这些包。 它也修改了一些搜索路径,例如PYTHONPATH,以确保:
- 当安装包时,它们被安装在当前活动的virtualenv里,而不是系统范围内的Python路径。
- 当import代码时,virtualenv将优先采取本环境中安装的包,而不是系统Python目录中安装的包。
还有一点比较重要,在默认情况下,所有安装在系统范围内的包对于virtualenv是可见的。 这意味着如果你将simplejson安装在您的系统Python目录中,它会自动提供给所有的virtualenvs使用。 这种行为可以被更改,在创建virtualenv时增加 --no-site-packages 选项的virtualenv就不会读取系统包,如下:
1 | virtualenv nowamagic_venv --no-site-packages |
大多数的Python包是通过 pip
程序安装的,在创建虚拟环境的时候virtualenv会自动添加进去。当一个虚拟环境被激活后,pip程序的位置会被添加到 PATH
中。
注:如果你使用pyvenv创建虚拟环境在Python 3.3中,则必须手动安装pip。安装指令在pip网站上可以找到。在Python 3.4下,pyvenv会自动安装pip。
比如,安装Flask到虚拟环境中,使用下面的命令:
(venv)$ pip install flask
通过这个命令,Flask和它的依赖集都会安装到虚拟环境中。你可以验证Flask是否正确安装通过启动Python解释器并试着导入它:
(venv)$ python
>>> import flask
>>>
如果需要安装的包比较多的时候,这样做会比较繁琐,我们还有一键安装的方法。首先新建一个文本文件,如:requirements.txt,然后将你需要安装的包名保存到该文件中(根据自己的需要),如下:
Babel==1.3
Flask==0.10.1
Flask-Login==0.2.7
Flask-SQLAlchemy==1.0
Flask-WTF==0.9.3
Jinja2==2.7.1
SQLAlchemy==0.8.2
WTForms==1.0.5
Werkzeug==0.9.4
psycopg2==2.5.1
...
最后你只需要输入以下命令,所有需要的包就可以全部安装好了:
(venv)$ pip install -r requirements.txt
如果没有出现错误,祝贺你:安装成功了。
若要查看当前环境安装了哪些包,可以使用下面的命令:
(venv)$ pip freeze
一般而言,所有python相关的包会装在系统目录里,譬如/usr/lib/ 或者/usr/local/lib/,这样的话,假设两个开发分支要求的库不一样,譬如对应在线版本的开发环境使用 Django1.3,但是一个新的开发分支基于Django1.4,两者就会互相影响。
Virtualenv 是一个虚拟环境程序,可以把开发环境隔离。基本思想是建立不同的环境目录,其中装有独立的各类包,甚至也可以是独立的不同版本python程序。
virtualenv 和 virtualenvwrapper,前者已经介绍,后者是一套很有用的扩展,提供了方便切换开发环境的快捷命令。
virtualenvwrapper 是一个建立在 virtualenv 上的工具,通过它可以方便的创建/激活/管理/销毁虚拟环境,没它的话进行上面的操作将会相当麻烦。 可以通过下面命令安装 virtualenvwrapper 。
1 | pip install virtualenvwrapper |
安装后,你需要配置它。下面是我的配置:
1 | if [ ` id -u` != '0' ]; then |
2 |
3 | export VIRTUALENV_USE_DISTRIBUTE=1 # <-- Always use pip/distribute |
4 | export WORKON_HOME=$HOME/.virtualenvs # <-- Where all virtualenvs will be stored |
5 | source /usr/ local /bin/virtualenvwrapper.sh |
6 | export PIP_VIRTUALENV_BASE=$WORKON_HOME |
7 | export PIP_RESPECT_VIRTUALENV= true |
8 |
9 | fi |
设置 WORKON_HOME 和 source /usr/local/bin/virtualenvwrapper.sh 只需要几行代码,别的部分是按照我个人喜好添加的。
将上面的配置添加到 ~/.bashrc 的末尾,然后将下面的命令运行一次:
1 | source ~/.bashrc |
如果你关闭所有的shell窗口和标签,然后再打开一个新的shell窗口或标签时, ~/.bashrc 也会被执行,此时将会自动的更新你的 virtualenvwrapper 配置。效果就跟执行上面的命令一样。
新建/激活/关闭/删除虚拟空间需要执行下面的命令:
1 | mkvirtualenv nowamagic_venv |
2 | workon nowamagic_venv |
3 | deactivate |
4 | rmvirtualenv nowamagic_venv |
Tab补全在virtualenvwrapper中是可用的。更多信息可以前往 virtualenvwrapper 的首页:http://www.doughellmann.com/projects/virtualenvwrapper/。