Ian Bicking's virtualenv has become one of those apps I just can't code without (or at least, I hate to code without). I have so many quick-hit, one-off, throwaway apps with so many strange and sometimes conflicting dependencies that I can't imagine how I'd get anything done if they all swam in the same soup.
This is all made better by Doug Hellman's virtualenvwrapper, which makes creating and managing virtual environments dead simple.
Given that, here are two tricks I figured out yesterday that could make things a little more interesting:
Using (Some) Global Site Packages
Part of what makes a
virtualenv so useful is that it doesn't inherit any Python packages installed globally. That's also a downside in a few edge cases. One of those is Mapnik.
Mapnik is a tool for rendering maps from spatial data. I was toying with TileStache last night and couldn't get Mapnik's Python bindings to install in a
virutalenv. Mapnik itself was installed globally (using homebrew), along with all its dependencies. Boost is the troublemaker here.
After hours--yes, hours--trying and failing to
pip install mapnik2 and getting errors saying I didn't have
boost_python installed (it is, globally), I was about to just give up and install the entire stack globally. But it made me queasy to have TileStache, gunicorn and whatever other Python libraries I needed for this one thing installed system-wide when all but one dependency could be safely left in an isolated
The trick here: toggleglobalsitepackages
Yes, that's a mess of concatenated words to type. There's also add2virtualenv, which adds just one library to a particular environment.
Use the global Mapnik. Source everything else locally.
Not just for CPython
I've been watching PyPy develop lately and the more I see, the more I want to try it out. But for all the reasons above, I'm a little nervous. How do dependencies work? Can I still
pip install pypy-awesome-lib?
virtualenv is the answer.
mkvirtualenv take a
--python argument to set the Python interpreter for that
virtualenv. Pass in
pypy and you're up and running.