Meet pyenv: a Simple Python Version Management tool. Previously known as Pythonbrew, pyenv lets you change the global Python version, install multiple Python versions, set directory (project)-specific Python versions, and yes create/manage virtual python environments ("virualenv's"). All this is done on *NIX-style machines (Linux and OS X) without depending on Python itself and it works at the user-level–no need for any sudo commands. So let’s start!


Follow the installation instructions or use the automatic installer. If you're using a Mac, I highly recommend installing pyenv with Homebrew (none of that MacPorts shenanigans). Whichever way you decide to go, after checking out the repository, be sure to add a couple of lines to your .bashrc (.bash_profile on Mac) to enable pyenv's auto-complete functionality.

Ubuntu Workstation Copy-Paste Install

This works best for our Ubuntu 12.04 workstations which default to a .bashrc configuration file in lieu of .bash_profile.

git clone git:// .pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

pyenv Suite Installer

This is the one-liner provided by the automatic installer.

curl -L | bash


~$ pyenv global
~$ pyenv versions
* system (set by /home/staff/jmoreira/.pyenv/version)

Usually you will only have one version of python installed, the system-wide version. That’s what’s shown in the above command. pyenv now allows you to expand upon this version. Let’s start by installing another python version. For instance, let’s go now to the cutting edge of python:

~$ pyenv install 3.4.0
Installing readline-6.3...
Installed readline-6.3 to /home/staff/jmoreira/.pyenv/versions/3.4.0

Installing Python-3.4.0...
Installed Python-3.4.0 to /home/staff/jmoreira/.pyenv/versions/3.4.0

(By the way, there is no need to memorize these. pyenv install –list will show all available Python versions to install).

~$ pyenv versions
* system (set by /home/staff/jmoreira/.pyenv/version)

pyenv now lists two python versions. To use python 3.4 as the global one we do:

pyenv global 3.4.0

You can also use pyenv to define a project-specific, or local, version of Python:

~$ pyenv global system

~$ mkdir cuting_edge
~$ cd cuting_edge/
~/cutting_edge$ pyenv local 3.4.0
~/cutting_edge$ python -V
Python 3.4.0
~/cutting_edge$ cd ..
~$ python -V
Python 2.7.6

It’s as simple as that.

Virtual Environments

To other virtualenv users, the idea of a local Python might seem familiar. Indeed, a local Python created from pyenv is almost like a Python virtual environment. The main difference is that pyenv actually copies an entire Python installation every time you create a new pyenv version. In contrast, virtualenv makes use of symbolic links to decrease the size of the virtualenv’s. If you can’t function without your virtual environments anymore then fear not, for there is a plugin for that: pyenv-virtualenv. This plugin adds complete virtualenv functionality to pyenv:

git clone ~/.pyenv/plugins/pyenv-virtualenv
source ~/.bashrc

~$ mkdir virtual_env
~$ cd virtual_env/
~/virtual_env$ pyenv virtualenv 3.4.0 venv
Ignoring indexes:
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/staff/jmoreira/.pyenv/versions/venv/lib/python3.4/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/staff/jmoreira/.pyenv/versions/venv/lib/python3.4/site-packages
Cleaning up...

~/virtual_env$ pyenv versions
* system (set by /home/staff/jmoreira/.pyenv/version)

Here I used Python 3.4 to create the virtualenv (Note that if you want to create a virtualenv from the system Python, then virtualenv needs to be installed at the system level as well).

~/virtual_env$ pyenv activate venv
(venv) ~/virtual_env$ python -V
Python 3.4.0
(venv) ~/virtual_env$ pip list
pip (1.5.4)
setuptools (2.1)
(venv) ~/virtual_env$ pyenv deactivate

This last command is the recommended way to deactivate the virtualenv. This ensures that pyenv remains working as normal after you leave the virtualenv.

pyenv’s magic works because it actually redefines your Python command:

~$ which python

When you try to run Python, it first looks for a .python-version in the current directory to decide which version of python to run. If it doesn’t find this file, then it looks for the user-level file ~/.pyenv/version.

And this is essentially all there is to it. Have fun developing Python code in a safe, environment-friendly way.

Special thanks to Adam Pah for the tips.