Why Don't You Use virtualenvwrapper?

Randall
Thu, 09 Sep 2010 04:17:53 +0000

If you're a python programmer, you've most likely heard of virtualenv. If you haven't, then you need to check it out.

virtualenv is a tool to create isolated Python environments.

In a nutshell, you can create as many virtual environments as you want. Each of these virtual environments is a small directory structure, which contains a copy of your python interpreter(s), and provides a sandbox environment in which you can install only the necessary packages you need to run your project, as well as remove your programs' dependence on system packages and python versions.

virtualenvwrapper Rocks!

virtualenvwrapper (available via pip or easy_install), is a set of scripts that makes managing multiple virtual environments easier--much easier.

In my day-to-day work, I typically use virtualenv to create various test environments. Let's say I want to test out a new package in my project, I may do something like:

rdegges@solitude:~/random_project$ virtualenv --no-site-packages env
New python executable in env/bin/python
Installing setuptools............done.
rdegges@solitude:~/random_project$ . env/bin/activate
(env)rdegges@solitude:~/random_project$ pip install nose
Downloading/unpacking nose
  Downloading nose-0.11.4.tar.gz (256Kb): 256Kb downloaded
  Running setup.py egg_info for package nose
    no previously-included directories found matching 'doc/.build'
Installing collected packages: nose
  Running setup.py install for nose
    no previously-included directories found matching 'doc/.build'
    Installing nosetests-2.6 script to /home/rdegges/random_project/env/bin
    Installing nosetests script to /home/rdegges/random_project/env/bin
Successfully installed nose
Cleaning up...
# do some testing here ...

I'll often repeat this process numerous times, as I don't want to clutter my official virtual environment which has my list of good packages and their resepective versions.

The problem with this approach, of course, is that it becomes tedious to manage a ton of virtual environments. It also causes clutter in version control environments, without careful exclusion rules.

This is where virtualenvwrapper comes into play.

virtualenvwrapper allows you to store as many virtual environments as you want, in a single non-project location. It provides convenient scripts for creating, editing, switching, and removing virtual environments with ease.

Here's how I'd use virtualenvwrapper to create a new test environment and do a bit of work in it:

rdegges@solitude:~/random_project$ mkvirtualenv --no-site-packages testnose
New python executable in testnose/bin/python
Installing setuptools............done.
virtualenvwrapper.user_scripts Creating /home/rdegges/.virtualenvs/testnose/bin/predeactivate
virtualenvwrapper.user_scripts Creating /home/rdegges/.virtualenvs/testnose/bin/postdeactivate
virtualenvwrapper.user_scripts Creating /home/rdegges/.virtualenvs/testnose/bin/preactivate
virtualenvwrapper.user_scripts Creating /home/rdegges/.virtualenvs/testnose/bin/postactivate
virtualenvwrapper.user_scripts Creating /home/rdegges/.virtualenvs/testnose/bin/get_env_details
(testnose)rdegges@solitude:~/random_project$ pip install nose
Downloading/unpacking nose
  Downloading nose-0.11.4.tar.gz (256Kb): 256Kb downloaded
  Running setup.py egg_info for package nose
    no previously-included directories found matching 'doc/.build'
Installing collected packages: nose
  Running setup.py install for nose
    no previously-included directories found matching 'doc/.build'
    Installing nosetests-2.6 script to /home/rdegges/.virtualenvs/testnose/bin
    Installing nosetests script to /home/rdegges/.virtualenvs/testnose/bin
Successfully installed nose
Cleaning up...
# do some testing here ...
(testnose)rdegges@solitude:~/random_project$ deactivate
rdegges@solitude:~/random_project$

Nice, eh? Now, let's say I want to work on another virtual environment that I've already defined, it's as easy as:

rdegges@solitude:~/random_project$ workon pycall
(pycall)rdegges@solitude:~/random_project$

Just use the workon command to instantly switch into an already defined virtual environment. And if I want to remove a virtual environment?

(pycall)rdegges@solitude:~/random_project$ deactivate
rdegges@solitude:~/random_project$ rmvirtualenv testnose
rdegges@solitude:~/random_project$

And bam, just like that, testnose is gone.

Give virtualenvwrapper a Try

It really is an awesome, extremely useful program. If you use virtualenv currently, you shouldn't write another line of code before installing and using it.

virtualenvwrapper can be downloaded here. The project website has great documentation, and plenty of examples which show off the rest of the great features that virtualenv has to offer.

Among other things, virtualenv also provides hooks for setting up virtual environments, which allow you to get really creative, and save yourself a LOT of time by automating common virtualenv tasks.