versoes de uma mesma biblioteca possam conviver no mesmo computador, sem conflitos. Vou exemplificar.Suponhamos que voce tenha 2 projetos: um usando Django 1.4 e outro usando Django 1.10. Se instalarmos o Django direto no Python do sistema, nao vai dar certo porque o que for instalado por ultimo vai sobrepor o primeiro. Um dos seus projetos nao vai conseguir rodar.O virtualenv resolve exatamente esse problema. Voce consegue ter os dois projetos rodando no mesmo computador, sem conflito entre as versoes das bibliotecas (Django, no nosso exemplo). E tem outra vantagem: voce nao precisa de acesso root para instalar as bibliotecas.Ao contrario do que o nome induz a pensar, um virtualenv nao e uma maquina virtual (VM). O virtualenv e uma solucao muito mais simples e muito mais facil de usar.Como o virtualenv funciona?---------------------------Explicando de forma simplificada, o virtualenv trabalha com a variavel de ambiente [PYTHONPATH](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH) para modificar o [module search path](https://docs.python.org/3/tutorial/modules.html#the-module-search-path). Na pratica ele diz para o interpretador do Python onde (em qual diretorio) buscar as bibliotecas para dar `import`.Para usar um virtualenv voce precisa:1. criar o virtualenv1. atualizar o `pip` (comando para instalar bibliotecas Python)1. ativa-lo1. instalar nele as bibliotecas desejadasA partir do Python 3.3 existe o modulo `venv` na biblioteca padrao. Os exemplos desse artigo foram testados em Python 3.5.Eu costumo criar um diretorio sob o meu `$HOME` onde guardo todos os virtualenvs: `$ mkdir ~/virtualenvs`. Segue abaixo um exemplo dos passos descritos acima: $ python3 -m venv ~/virtualenvs/projeto_dj1_4 $ source ~/virtualenvs/projeto_dj1_4/bin/activate (projeto_dj1_4) $ pip install --upgrade pip setuptools (projeto_dj1_4) $ pip install django==1.4.* (projeto_dj1_4) $ cd path/para/o/diretorio/fonte/do/projeto (projeto_dj1_4) $ python manage.py shell Python 3.5.2 (default, Jul 20 2016, 16:13:40) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import django >>> django.VERSION (1, 4, 22, 'final', 1)Repetindo os passos acima para o outro projeto, com Django 1.10, o resultado do ultimo comando seria: (projeto_dj1_10) $ python manage.py shell Python 3.5.2 (default, Jul 20 2016, 16:13:40) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import django >>> django.VERSION (1, 10, 3, 'final', 1)**Obs.:** o Ubuntu 16.04 nao traz o `pip` junto com o virtualenv. Portanto, nele os comandos seriam: $ python3 -m venv ~/virtualenvs/meu_proj --without-pip $ source ~/virtualenvs/meu_proj/bin/activate (meu_proj) $ curl https://bootstrap.pypa.io/get-pip.py | python - (meu_proj) $ pip install django==1.4.*Vale lembrar que voce precisa ativar o virtualenv sempre antes de usa-lo com `$ source path/para/o/virtualenv/bin/activate`. E assim que voce diz ao Python qual virtualenv esta ativo no nomento.Quando voce terminar de trabalhar com o virtualenv, basta desativa-lo com `$ deactivate` ou simplesmente desligar o computador ou fechar a janela do shell.Como e aquele lance de PYTHONPATH?----------------------------------Voltando um pouco ao inicio, agora que voce ja entendeu para que serve e como funciona um virtualenv, lembra que eu falei sobre o `PYTHONPATH`? Quer ver a diferenca? Primeiro, vamos ver o Python do sistema, sem virtualenv: $ python Python 3.5.2 (default, Jul 20 2016, 16:13:40) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print('\n'.join(sys.path)) /home/viniciusban/.pyenv/versions/3.5.2/lib/python35.zip /home/viniciusban/.pyenv/versions/3.5.2/lib/python3.5 /home/viniciusban/.pyenv/versions/3.5.2/lib/python3.5/plat-linux /home/viniciusban/.pyenv/versions/3.5.2/lib/python3.5/lib-dynload /home/viniciusban/.pyenv/versions/3.5.2/lib/python3.5/site-packages >>>