luciano@ratamero.com

#ajudaLuciano - virtualenv e virtualenvwrapper: como eu uso

Luciano Ratamero - Thursday, December 28, 2017

como eu sou (pessimamente) conhecido por customizar (demais) meu computador de trabalho com scripts, aliases e o que for, faz um tempo que o pessoal tem me cobrado um post sobre como eu uso virtualenv e virtualenvwrapper. aqui vão algumas dicas de como eu uso ambos pra facilitar minha vida como desenvolvedor, principalmente nesse mundo de python 2/3, angular, react, docker, neo4j e afins. ;)

for native english speakers, here's the translated post

o que é o virtualenvwrapper

pra quem não conhece, o virtualenvwrapper é um conjunto de extensões da virtualenv. ele provê uma série de comandos úteis pra quem lida com virtualenvs (alguns que eu uso diariamente).

o virtualenvwrapper funciona da seguinte forma: ele separa suas pastas de projeto das que pertencem à virtualenv, como bin, lib, include e afins, e te dá algumas utilidades. ele coloca as virtualenvs dentro da pasta da variável de ambiente WORKON_HOME. isso é ótimo pra quem gosta de não sujar a pasta do projeto com coisas externas e faz com que você não tenha que colocar as pastas da virtualenv no gitignore, por exemplo.

no entanto, eu pessoalmente prefiro ter os arquivos de bibliotecas dentro da pasta do projeto por dois motivos:

  • sempre sei onde elas estão sem precisar me lembrar de qual pasta coloquei como WORKON_HOME;
  • e, o melhor, facilito a vida do meu editor de texto, que vai conseguir ler o código das bibliotecas usadas.

isso faz com que, por exemplo, meu editor possa me recomendar nomes de módulos/classes/funções e faça funcionar o lindo "Go To Definition", que abre o local do código-fonte de algum módulo/classe/função que está sendo usada no seu código. tanto o Atom quanto o Sublime têm plugins ótimos pra "Go To Definition", e isso me salvou inúmeras vezes.

então, por motivos argumentativos, vou usar minha preferência pra explicar algumas das minhas decisões. belessa? belessa.

workon, cdvirtualenv e outros comandos úteis

o virtualenvwrapper tem uma cacetada de comandos bem úteis pro dia-a-dia do desenvolvedor python, então vou falar sobre os que eu mais uso:

workon

o workon é um comando que serve pra você ligar sua virtualenv de qualquer lugar. ao executar workon NOMEDOPROJETO, você fica na mesma pasta onde está, mas com todos os parâmetros da sua env, como a versão do python, as bibliotecas instaladas, as variáveis de ambiente e tudo mais. serve como ponto de entrada pra outros hacks que vou destrinchar e aceita tab complete.

cdvirtualenv

extremamente útil se sua pasta de env e de projeto forem a mesma. o cdvirtualenv te leva diretamente pra raiz da pasta que contém sua env sem que você precise saber qual ela é. se sua pasta de projeto for a mesma, você ganha o bônus de ir diretamente pra pasta do projeto sem precisar dar cd pra ela. faz combo com o workon (novo terminal > workon NOMEDOPROJETO > cdvirtualenv).

cpvirtualenv

serve pra você replicar uma virtualenv pra outra. pouco usado, mas salvador da pátria quando é.

cdsitepackages

te leva pra pasta com todas suas bibliotecas instaladas. simples, lindo.

a mágica dos scripts de postactivate e postdeactivate

agora que vêm os maiores pulos do gato (pulos dos gatos?): o virtualenvwrapper te dá a opção de você escrever scripts bash pra antes/depois de você ativar uma virtualenv. basta colocar um arquivo chamado postactivate e/ou postdeactivate na pasta bin da sua virtualenv e eles serão executados.

isso te permite fazer duas coisas extremamente úteis:

  • exportar/sobrescrever variáveis de ambiente;
  • executar qualquer comando específico do seu projeto.

o primeiro é autoexplicativo, mas o segundo é lindo demais; ele faz com que você possa, por exemplo, executar um cdvirtualenv assim que sua env for ativada, te levando direto pra pasta projeto. ou então, melhor ainda, iniciar dependências externas da sua aplicação/levantar imagens do docker. ou até fazer com que uma vaquinha diga qual a pasta da sua virtualenv (cowsay $VIRTUAL_ENV). o mesmo pra quando você desativa uma virtualenv (por favor, vamo desligar os treco de docker, né?). enfim, a utilidade é infinita.

outro ponto interessante é que o virtualenvwrapper cria arquivos globais de todos esses eventos (pré e pós tudo) na sua pasta de virtualenvs. caso esses sejam editados, todas as envs executarão esses scripts quando forem ativadas/desativadas.

pra fechar, em alguns dos projetos nos quais eu trabalho, a gente até já convencionou que terão, na pasta contrib, um script de postactivate pronto pra automatizar alguns processos. acaba servindo como documentação de como as coisas funcionam, e tendem a ser bem menos complicados do que dockerfiles, dependendo de pra que são usados. bem maneiro.


enfim, essas foram algumas dicas de como eu automatizo alguns processos chatos usando virtualenv e virtualenvwrapper. espero que tenha sido útil pra vocês, e caso vocês tenham algum hack similar que ajude no desenvolvimento em ambientes python, mandem ver nos comentários! eu vou ficando por aqui. abraços, e até mais o/