=======================
Utilizing virtualenv
=======================
Different projects, applications, or scripts may require different versions of
Python (e.g. 2.6 vs 2.7 vs 3.X) and can have different sets of dependencies.
Virtual environments are a great way of creating isolated spaces for
compartmentalizing specific Python versions and/or sets of package dependencies
for separate projects and applications.
This additionally prevents the global Python installs from becoming polluted
with a plethora of packages and incompatibilities between applications which
may require different versions of the same dependency that may lead to
conflicts or difficult-to-debug errors. It also avoids typical permissions
errors when managing global packages and makes removing a set of application
dependencies as simple as deleting the virtualenv directory.
*NOTE: While the prerequisites recommend the latest Python 2 and Python 3
installs, if there is a situation where you need a very specific version of
Python, as long as that version is installed and you know the path to the
Python executable then you can create a virtual environment for that version.*
Prerequisites
------------------------
* First things first, make sure that you have the
`latest version of Python 2 or Python 3 `_
downloaded and installed (or just skip the manual download
by installing via the appropriate package manager for your OS)
* Next you'll need to make sure that
`pip is installed `_
(it comes automatically with Python 2 >= 2.7.9 and Python 3 >= 3.4)
* Ensure that pip and setuptools are updated: pip install -U pip setuptools
Setup
------------------------
Next we'll need to install the virtual environment packages:
.. code-block:: bash
pip install -U virtualenvwrapper virtualenv
WINDOWS: if you are doing this on a windows box you will instead need to
install virtualenvwrapper-win and follow the
`directions here `_
(good luck!):
.. code-block:: bash
pip install -U virtualenvwrapper-win virtualenv
While virtualenv can be used by itself, it is far easier to use the wrapper
package which makes creating, managing, and activating virtual environments a
far more pleasant experience.
Configuration
------------------------
WINDOWS: again, if you are doing this on a windows box, you should refer to
`these directions `_
since virtualenvwrapper, and hence this whole section, is only for
Bourne-compatible shells (have fun!)
Now that everything is installed, we need to configure our environment to
actually utilize it. The following needs to be added somewhere in your
``~/.bash_profile`` or your shell equivalent file:
.. code-block:: bash
#######################################################
### virtualenv setup and shortcuts
export PIP_REQUIRE_VIRTUALENV=true
export WORKON_HOME="~/.envs"
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
source /usr/local/bin/virtualenvwrapper.sh;
fi
alias mkvenv="mkvirtualenv"
alias mkvenv3="mkvirtualenv -p python3"
alias rmvenv="rmvirtualenv"
alias lsvenv="lsvirtualenv"
Broken down, the export PIP_REQUIRE_VIRTUALENV=true actually prevents Python
packages from being installed globally unless a specific flag is passed to pip
to force it install anyway. What this does is it reminds you if you forget to
activate a virtual env, and prevents packages from being installed globally
unless you specifically go out of your way to do so.
The ``export WORKON_HOME="~/.envs"`` tells virtualenvwrapper the location where
you want it to create all of your virtual environments (this should NOT be
within a git repository as the env should NOT be committed with code). Modify
this export as needed for wherever you want it to use as the location.
The if statement is actually the most important part of the additions since it
is what actually initializes the wrapper whenever you start a shell session so
it can do its job. Without the wrapper script getting sourced, it will not work
correctly!
The remainder of the additions are aliases which I like to use, however they
are not strictly required if you do not wish to add them.
Managing envs
---------------
Basic usage for creating a virtual env is::
mkvirtualenv
For example::
mkvirtualenv example
Or using the alias::
mkvenv example
You can similarly list or remove environments using the aliases::
lsvenv
rmvenv example
Creating a Python 3 env
--------------------------
The alias from above can be used to quickly create a virtual env with the
system install version of Python 3::
mkvenv3 example_env
Or using just virtualenvwrapper without the alias::
mkvirtualenv -p python3 example_env
Using specific Python versions
----------------------------------
To use a specific version of Python in a virtual env, you need to explicitly
tell it which one via the -p flag:
.. code-block:: bash
mkvirtualenv -p path/to/specific/version/of/python
mkvenv -p path/to/specific/version/of/python
Activating/deactivating an env
-------------------------------------
When creating a virtual env, it will automatically be activated, however, to
activate an env that is not currently active, you use the workon command::
workon example_env
Activating a virtual env gives you access to the installed packages in the env
and the normal Python executable found on the command line should be the
executable for the version of Python specified when the env was created (the
default Python install on the system if none was specified).
Deactivating an env
Leaving an env is also very simple::
deactivate