Ambiente Isolado para Python com virtualenv

Foto: Yuko Honda

Boa parte do meu dia-a-dia de desenvolvedor é gasto em proramando em Python. Gosto de estar sempre atualizado com o que há de novo para essa linguagem e para isso saio instalando tudo o que aparece para para experimentar. Além de Python o Linux também faz parte da minha vida e uso ele quase 100% do meu tempo (em vias de mudar para o OS X).

A plataforma Python, de uns tempos pra cá, vêm padronizando os arquivos Eggs para distribuição de aplicações e bibliotecas. Em conjunto com o PyPI (Python Package Index) e o utilitário easy_install (que é parte do framework setuptools) é possível instalar componentes Python com apenas um comando.

A facilidade para instalar esses pacotes é enorme mas removê-los é chato porque envolve a edição de alguns arquivos texto, e ter permissão de escrita no diretório de bibliotecas do Python (permissão que também é necessária para a instalar o pacote).

Cada pacote instalado acrescenta uma entrada ao sys.path do Python fazendo com que o tempo para importar um módulo aumente um pouco mais (cada uma dessas entradas é consultada em busca do módulo e se você der uma olhada na saída do strace verá que a procura por um módulo envolve vários passos).

O Linux que eu uso (Ubuntu) precisa ter um ambiente Python estável, já que grande parte de suas aplicações roda em cima dessa linguagem, ou seja, danificar esse ambiente pode atrapalhar todo o funcionamento do sistema.

Isso tudo junto com o fato de que adoro experimentar as novidades do mundo Python faziam com que meu Python ficasse totalmente poluído com versões bleeding edge de bibliotecas que muitas vezes são incompatíveis com as versões “oficialmente suportadas” pelo pessoal que faz o Ubuntu.

Seria necessário um jeito fácil de se criar ambientes isolados do Python usando como base a própria instalação do sistema para que eu pudesse fazer esses testes e experiências sem danificá-lo. Não ficar replicando cópias de Python pela máquina também seria interessante.

E então surge a solução…

Parece engraçado mas no mesmo dia que perdi horas “arrumando” o Python em meu computador eu li no blog do Ian Bicking que ele tinha desenvolvido um programinha que fazia exatamente o que eu precisava: o virtualenv.

O uso do virtualenv é extremamente simples e direto. Basta instalar, executar e ativar.

Instalação

Se você está usando Ubuntu ou Debian:

sudo apt-get install python-setuptools
sudo easy_install virtualenv

Se não está:

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py

Criando o ambiente

Para criar um ambiente basta executar o virtualenv e passar como parâmetro o nome do diretório onde tal ambiente será instalado:

virtualenv meu_python

Esse comando irá criar um diretório chamado meu_python com os diretórios:

  • bin – executável do interpretador, o script easy_install e o arquivo activate que será usado para “ativar” o ambiente. Quando o ambiente está “ativo” os executáveis dos aplicativos Python são instalados aqui também.
  • lib – a árvore com links simbólicos e/ou cópias de todos os módulos e bibliotecas do Python. Quando esse ambiente está “ativo” os módulos e pacotes serão sempre instalados dentro desse diretório.
  • include – dentro desse diretório estão os links simbólicos para todos os headers do Python que são necessários para se compilar extensões escritas em C para ele.

Ativando o ambiente para usar

Para usar esse ambiente recém-criado é necessário ativá-lo. para isso basta executar o seguinte comando:

source meu_python/bin/activate

Esse comando irá adicionar o diretório meu_python/bin no PATH da sua sessão e mudar o prompt para que você possa distinguir visualmente quando este ambiente está ativo.

Atenção: O virtualenv não cria o link simbólico python -> python2.5, portanto, se precisar dele você terá que criá-lo à mão com o seguinte comando

(cd meu_python/bin; ln -s python2.5 python; hash -r)

Depois disso é só sair instalando as coisas sem a menor preocupação.

PS. Eu não testei o virtualenv no Windows nem no Mac OS X mas no site do projeto é possível notar que tem gente usando ele também nessas duas plataformas, portanto, eu acho que ele também funcione corretamente nelas.

Quer mais?

Você pode encontrar várias dicas para desenvolvimento Python (e Django) nos artigos reunidos em minha newsletter quinzenal “O Melhor da Internet”. Você vai receber links com o melhor conteúdo relacionado a Python, Django, Carreira, Negócios e Empreendedorismo.

Para assinar basta preencher o formulário abaixo.

[mc4wp_form]
  • Pingback: Osvaldo via Rec6()

  • Será possível usar o virtualenv na hora de fazer deploy de aplicações web? Assim cada aplicação teria sua própria versão das bibliotecas usadas sem impactar o resto do ambiente.

  • Será possível usar o virtualenv na hora de fazer deploy de aplicações web? Assim cada aplicação teria sua própria versão das bibliotecas usadas sem impactar o resto do ambiente.

  • Oi Vinicius,

    Eu faço o deploy em meus clientes usando o virtualenv mas o processo todo ainda é manual, ou seja, eu preciso instalá-lo, instalar todos os módulos de terceiros com ele, e no caso de aplicações Web ainda é necessário ajustar algumas configurações do web server para que ele use o ambiente criado no lugar do Python do sistema.

  • Oi Vinicius,

    Eu faço o deploy em meus clientes usando o virtualenv mas o processo todo ainda é manual, ou seja, eu preciso instalá-lo, instalar todos os módulos de terceiros com ele, e no caso de aplicações Web ainda é necessário ajustar algumas configurações do web server para que ele use o ambiente criado no lugar do Python do sistema.

  • Vou começar hoje a alterar meu ambiente de desenvolvimento afim de usar o virtualenv na minha máquina local. Depois vou fazer deploy, mesmo que manual como você falou, usando ele também. Andei lendo sobre WSGI e virtualenv, não parece ser problemático.

    Obrigado pela dica e atenção dispensada! 🙂

  • Vou começar hoje a alterar meu ambiente de desenvolvimento afim de usar o virtualenv na minha máquina local. Depois vou fazer deploy, mesmo que manual como você falou, usando ele também. Andei lendo sobre WSGI e virtualenv, não parece ser problemático.

    Obrigado pela dica e atenção dispensada! 🙂

  • Pingback: Desenvolvendo web com software livre, pt. 2 | Profissionais TI()

  • Pingback: Thiago Hiromi » Definir um ambiente virtual (virtualenv) no Linux()

  • Tem também o virtualenv-wrapper que disponibiliza comandos para gerenciar e alternar ambientes.

    Para deploy é legal ter um arquivo de requirements, aí é possível instalar tudo de uma só vez com o pip.

  • Tem também o virtualenv-wrapper que disponibiliza comandos para gerenciar e alternar ambientes.

    Para deploy é legal ter um arquivo de requirements, aí é possível instalar tudo de uma só vez com o pip.

  • Não estou achando esse programa “source” aqui no ubuntu lucid. Instalei o virtualenv pelo apt-get mas não veio o source. Alguma dica?

  • Oi Italo,

    O source não é um programa. Ele é um comando interno do Bash. Algumas pessoas usam o '.' no lugar do source:

    . bin/activate

    Se você não usa Bash deve ter algum comando equivalente.

  • Pingback: Instalar VirtualEnv no Linux | Aprendiz Django()

  • Pingback: 2 – Instalação de Bottle | Meu blog pessoal()