Setting up Django environment using Pyenv and Virtualenv

Setting up Django environment using Pyenv and Virtualenv

Python is a great language for general programing, but when combined with the Django framework, Web development in Python becomes a breeze.

But managing different python versions and packages can start become a real pain. If you are following a tutorial online for instance or you want to run a particular python app that works with particular version of python, then things can get hairy. You have to synchronize your python environment together with the developed app.

Luckily, there are tools to manage various Python versions. We shall use Pyenv and Virtualenv to manage various python versions and packages giving us an isolated workspace from the global system python library.


Pyenv enables you run multiples versions of python on the same machine. It accomplishes this by intercepting Python commands using shim executables injected into your PATH.


Clone pyenv from github into wherever you like. For this case, we close it to ~/.pyenv.

$ git clone ~/.pyenv

Now we make sure that our shell understands pyenv binaries at boot by adding it ~/.bash_profile. Note that if you are using specific Linux shells such as zsh, then can place this code in ~/.zshrc and for bash ~/.bashrc or ~/.bash_profile. You should run source ~/.bashrc or source ~/.zshrc afterwards or restart your terminal.

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

You can confirm pyenv is installed by running pyenv –version which should output the version number.

Now pyenv is installed. Now we can install a new version of python by running
pyenv install 3.6.0.

If you get error “zipimport.ZipImportError: can’t decompress data; zlib not available”. Then simply install zlib1g-dev like so “sudo apt-get install zlib1g-dev”.

We can then use virtualenv to create a virtual python environment where we determine the python environment we want and packages.


virtualenv is a tool to create isolated Python environments. We can install virtualenv using python pip, the language’s package manager like so. First make sure pip is installed via “sudo apt install python3-pip”.

pip install virtualenv.

If you wish to install virtualenv globally, then you can run the command as root like so sudo pip install virtualenv or sudo apt-get install python-virtualenv.

To create a new virtual environment, create your project/app folder and then run the virtualenv command over it. Then activate your new virtual environment;

mkdir ~/workspace/new_app
virtualenv ~/workspace/new_app
source ~/workspace/new_app/bin/activate

Now you can install python packages specific to your project that are isolated from the global python library.

One-line installer

Now I know you are dying for an easy way out. Instead of doing all this steps manually, you could just run the pyenv-installer. It will install pyenv as well as virtualenv or actually the pyenv-virtualenv pyenv plugin. It combines pyenv and virtualenv so that you can install and manager different python versions as well as isolate python packages on a project basis.


$ curl | bash redirects to the install script in this repository and the invocation above is equivalent to:

$ curl -L | bash
#Restart your shell so the path changes take effect:
#You can now begin using pyenv.


$ pyenv update

Here’s an example of a bash script that installs pyenv, then downloads and installs python 3.6.0, creates a virtual environment called django1.8, activates it and then installs django 1.8 to that environment.

curl -L | bash
cat   /home/vagrant/.bash_profile
export PATH="/home/vagrant/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
source /home/vagrant/.bash_profile
pyenv install 3.6.0
pyenv virtualenv 3.6.0 django1.8
pyenv activate django1.8
pip install django==1.8

Or you can run it interactively on the terminal.

#list available virtual enviroments
oquidave@daverig % pyenv virtualenvs 
  3.6.2/envs/lordi (created from /home/oquidave/.pyenv/versions/3.6.2)
  venv27 (created from /home/oquidave/.pyenv/versions/2.7)
* venv3.6 (created from /home/oquidave/.pyenv/versions/3.6.2)

(venv3.6) oquidave@daverig (master) [1] % pyenv virtualenv 3.6.2 django2.0
Using base prefix '/home/oquidave/.pyenv/versions/3.6.2'
New python executable in /home/oquidave/.pyenv/versions/3.6.2/envs/django2.0/bin/python3.6
Also creating executable in /home/oquidave/.pyenv/versions/3.6.2/envs/django2.0/bin/python
Installing setuptools, pip, wheel...done.
Requirement already satisfied: setuptools in /home/oquidave/.pyenv/versions/3.6.2/envs/django2.0/lib/python3.6/site-packages
Requirement already satisfied: pip in /home/oquidave/.pyenv/versions/3.6.2/envs/django2.0/lib/python3.6/site-packages
pyenv: cannot rehash: /home/oquidave/.pyenv/shims/.pyenv-shim exists

oquidave@daverig (master) % pyenv activate django2.0

(django2.0) oquidave@daverig (master) % pip install django==2.0

Collecting django==2.0
  Using cached
Collecting pytz (from django==2.0)
  Downloading (510kB)
    100% |████████████████████████████████| 512kB 420kB/s 
Installing collected packages: pytz, django
Successfully installed django-2.0 pytz-2018.4
pyenv: cannot rehash: /home/oquidave/.pyenv/shims/.pyenv-shim exists

(django2.0) oquidave@daverig (master) [1] % python --version                                  
Python 3.6.2

(django2.0) oquidave@daverig (master) % django-admin version

Image: Pixabay

Further reading:


Leave a Reply