Ambientes virtuais Python

June 16, 2015

De um tempo pra cá tenho passado boa parte do meu tempo brincando com Python e Django. Por curiosidade normalmente eu acabo tento várias versões de determinadas bibliotecas, inclusive do próprio Python e também do Django. Isso poderia ser um problema, mas não é.

Eu acho que todo mundo já deve conhecer e usar o virtualenv.

Pra quem não sabe, imagine o seguinte cenário, você tem o projeto A que usa a versão 1 da biblioteca X e começou a desenvolver o projeto B que usa a versão 2. Vamos supor agora que as versões 1 e 2 não possuem uma API compatível, se você atualizar para a versão 2 terá problemas com o projeto A.

Esse é um problema solucionado pelo virtualenv, outra situação que ele é muito útil é caso você não tenha acesso privilegiado para instalar nada no site-packages global.

Ele cria ambientes isolados, possibilitando que você tenha vários ambientes para as mais diferentes necessidades, é tipo Bombril 1001 utilidades. Para instalar o virtualenv:

$ sudo pip install virtualenv

Para criar um ambiente é bem simples, virtualenv path-para-o-ambiente, por exemplo:

$ virtualenv ~/venv

Eu por padrão uso venv para o nome do diretório do ambiente. E para ativar o ambiente criado:

$ source venv/bin/activate

Eu costumo criar um ambiente dentro do diretório raiz de cada diretório e ignoro ele no .gitignore.

Como eu ando usando bastante coisa diferente e começando vários projetinhos para testes, comecei a ficar cansado desse workflow. Eu poderia colocar a regra no .gitignore global, ou organizar todos os meus ambientes em um diretório comum, fora dos projetos, ou melhor ainda, eu poderia usar alguma coisa que faça isso por mim.

virtualenvwrapper

Ele é um conjunto de extenções e wrappers para o virtualenv, possui comandos para criar, deletar e gerenciar os ambientes.

Das diversas vantagens que o virtualenvwrapper fornece, ele organiza todos os ambientes em um só lugar, fornece wrappers para gerenciamento dos ambientes (criar, deletar, copiar), trocar de ambientes com um único comando, tab completion para os nomes dos ambientes nos comandos, etc.

Assim como o virtualenv, o virtualenvwrapper é extremamente difícil de instalar:

$ sudo pip install virtualenvwrapper

Aí basta configurar algumas variáveis no .bashrc (se você usar o bash, claro):

export WORKON_HOME=$HOME/.venvs
export PROJECT_HOME=$HOME/Projetos
source /usr/local/bin/virtualenvwrapper.sh

WORKON_HOME é o diretório onde seus ambientes serão criados. PROJECT_HOME é onde você costuma colocar os seus projetos, essa variável deve ser configurada antes do comando mkproject ser usado.

Vamos supor que agora você queira criar um ambiente para um novo projeto, poderia simplesmente usar:

$ mkvirtualenv estrela_morte

Um novo ambiente seria criado no diretório atribuído para a variável WORKON_HOME, e após a criação o ambiente seria ativado. No seu bash apareceria entre parenteses (estrela_morte), indicando que tudo que você instalar com o pip será instalado nesse ambiente e que todos os scripts que você rodar a partir de agora, usarão as dependências que estão instaladas aí.

Agora, outro comando bem bacana é o mkproject, ele faz algo parecido, porém facilita um pouco. Se você for começar um novo projeto, provavelmente irá criar um ambiente Python e um diretório para os arquivos do projeto, o mkproject simplifica isso em um comando só.

$ mkproject blog

Esse comando criaria um ambiente chamado blog em WORKON_HOME, e um diretório para o projeto, também chamado blog, em PROJECT_HOME.

Para exibir uma lista dos ambientes:

$ workon

Para ativar determinado ambiente:

$ workon estrela_morte

Para uma fonte confiável de informação, segue a documentação dos dois projetos: virtualenv e virtualenvwrapper.