Python Virtual Environments com venv
O uso de ambientes virtuais no Python já está consagrado através de ferramentas bem populares como virtualenv e virtualenvwrapper. No entanto, a partir do Python 3.3 temos o módulo venv que implementa o gerenciamento de ambientes virtuais de acordo com a PEP 405. Porém, o módulo venv não disponibiliza todas as funcionalidades fornecidas pelas ferramentas de terceiros citadas acima.
Usando venv
Veja como é simples usar o novo módulo venv para criar seus próprios ambientes virtuais.
python -m venv caminho/para/o/novo/ambiente
ou
pyenv caminho/para/o/novo/ambiente
Para criarmos um ambiente onde desenvolveremos com Django 1.8:
$ pyenv ~/.pyenv/django_1.8
$ cd ~/.pyenv/django_1.8
$ source bin/activate
(django_1.8)$ pip install django==1.8.7
(django_1.8)$ cd ~/Projetos
(django_1.8)$ django-admin newproject blog
Perceba que estou padronizando o local dos meus ambientes virtuais em ".pyenv" dentro da minha pasta pessoal. Você pode escolher qualquer outro lugar, mas eu aconselho fortemente que você mantenha todos seus ambientes virtuais na mesma pasta.
Após criado o ambiente, basta ativá-lo e instalar a versão desejada do django e quaisquer outros pacotes.
Se você quiser criar um segundo ambiente, com a versão mais recente do django, basta seguir os comandos abaixo:
$ pyenv ~/.pyenv/django_1.9
$ cd ~/.pyenv/django_1.9
$ source bin/activate
(django_1.9)$ pip install django
(django_1.9)$ cd ~/Projetos
(django_1.9)$ django-admin newproject blog2
Bacana, simples, mas meio repetitivo ter que ficar entrando na pasta do ambiente virtual desejado e ativando sempre que quiser trabalhar com ele.
É aí que entra uma outra ferramenta…
pyenv-virtualenv
O pyenv-virtualenv é um plugin para o pyenv que nos fornece facilidades no gerenciamento de ambientes virtuais. Ele faz uso da API do novo módulo venv, não sendo por isso redundante como as antigas ferrametnas virtualenv e virtualenvwrapper (apesar de que recentemente elas foram atualizadas para também utilizarem o módulo venv).
Instalação
No OSX basta utilizar o homebrew:
brew update
brew install pyenv-virtualenv
Em seguida adicionar duas linhas ao seu ~/.bash_profile
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Agora precisamos instalar a versão desejada do Python no pyenv, já que ele isola totalmente seu ambiente, inclusive a versão do Python.
pyenv install -l # lista as versões disponíveis
pyenv install 3.5.1 # instala a versão 3.5.1 para o pyenv
pyenv shell 3.5.1 # usa a versão 3.5.1 no shell corrente
python -V # deve retornar: Python 3.5.1
cd ~/.pyenv # local onde ficam os ambientes virtuais
ls -l
ls -l versions
Perceba que podemos instalar qualquer uma das versões listadas pelo comando "pyenv install -l".
Usando pyenv-virtualenv
Agora vamos criar um novo virtualenv para trabalhar com django:
$ pyenv virtualenv 3.5.1 django_latest
$ pyenv virtualenvs
$ pyenv activate django_latest
(django_latest)$ pip install django
(django_latest)$ which django-admin
Primeiro criamos o novo ambiente virtual chamado django_latest definindo a versão 3.5.1 do Python para ser utilizada neste novo ambiente. Depois listamos os ambientes existentes e ativamos o django_latest. Já dentro do ambiente instalamos a versão estável mais recente do django através do pip. Por último verificamos que o utilitário django-admin já está disponível.
Uma vez criado o ambiente virtual e instalado os pacotes desejados, você já pode criar um novo projeto django e definir o virtualenv utilizado no arquivo .python-version. Dessa forma, sempre que você entrar na pasta do seu projeto, o ambiente será ativado automaticamente. Veja:
Criando o projeto:
$ pyenv virtualenvs # verificando quais meus ambientes
$ pyenv activate django_latest
(django_latest)$ django-admin startproject blog
(django_latest)$ cd blog
(django_latest)$ pyenv local django_latest
O comando pyenv local <virtualenv>, cria o arquito .python-version com o nome do virtualenv em seu interior. Assim, sempre que você acessar a pasta do projeto o virtualenv será ativado automaticamente.
$ django-admin # command not found
$ cd ~/blog
(django)$ python -V # exibe Python 3.5.1
(django)$ cd ..
$ python -V # exibe Python 2.7.10