I've started to do some Clojure in my spare time. The default tool adopted by the community to manage projects is [[http://leiningen.org][leiningen]]. For those of you who don't know what =lein= is, it's a tool to automate your Clojure project: it will boostrap a new project, install the dependencies, and there's a plugin mechanism to extend the default possibilities of the tool. One of the nice feature of the tool is the *checkouts* directory. From the [[https://github.com/technomancy/leiningen/blob/preview/doc/FAQ.md][FAQ]]: #+BEGIN_QUOTE If you create a directory named checkouts in your project root and symlink some other project roots into it, Leiningen will allow you to hack on them in parallel. #+END_QUOTE For Python projects at [[http://www.saymedia.com/careers][$work]] I use [[http://virtualenvwrapper.readthedocs.org/en/latest/][virtualenvwrapper]] to easily work on them without having to deal with conflicting dependencies. When I need to change a library that is used by one of the project, usually I go to the virtualenv directory and create a symlink so it uses the one I'm editing. What I really want is a mechanism similar to =lein=, where I can have a *checkouts/* directory inside the main project, where I can clone a library or create a symlink. Since =virtualenvwrapper= provides a hook mechanism, I wrote a small hook inside *~/.virtualenvs/postactivate*: #+BEGIN_SRC sh #!/bin/bash # move to the directory of the project proj_name=$(echo $VIRTUAL_ENV|awk -F'/' '{print $NF}') proj_path=/home/vagrant/src/$proj_name cd $proj_path if [ -d checkouts ]; then for ext in $(ls checkouts); do export PYTHONPATH=proj_path/checkouts/$ext:$PYTHONPATH done fi #+END_SRC Then, when I type =workon $project_name= in my shell, the environment is activated, I'm moved to the right directory, and the library inside the *checkouts/* directory are added to my *PYTHONPATH*.