Meu guia definitivo de ambientação em Python
Baseado em: Guia Definitivo Para Organizar Meu Ambiente Python
Segue as adaptações para minhas necessidades:
- Quero poder incluir outros interpretadores como PyPy e Anaconda;
- O Python3 tem que ser meu padrão pra tudo.
- Quero ter apenas um Jupyter Notebook que funcione com Python3 e que ele detecte se tem um virtualenv ativado quando eu executar o comando jupyter notebook.
- Quero ter apenas um iPython Console para Python3, ou seja, nada de ficar instalando iPython no virtualenv dos meus projetos;
- Quero ter utilitários genéricos escritos em Python (ex: youtube-dl) disponíveis no meu sistema sem poluir as instalações globais do Python, evitando assim qualquer possibilidade de aporrinhação com versões de bibliotecas globais.
- Quero usar virtualenvwrapper para os projetos que desenvolvo permitindo que eu mude de contexto/projeto rapidamente com apenas um comando.
- Quero que este ambiente tenha fácil manutenção sem ficar customizando demais o PATH do sistema.
Primeiro é preciso instalar o pyenv com suas 2 extensões pyenv-virtualenv e pyenv-virtualenvwrapper. Eu uso cada uma das extensões com propósitos diferentes:
Uso o pyenv para instalar interpretadores Python; Uso o pyenv-virtualenv para configurar meu ambiente global; Uso o pyenv-virtualenvwrapper para os projetos em que trabalho;
O virtualenvwrapper concentra seus virtualenvs em um mesmo diretório e o código dos seus projetos em outro. No meu ambiente organizo assim:
# Todos meus virtualenvs ficam em...
mkdir ~/.ve
# Todos meus projetos ficam em...
mkdir ~/workspace
É preciso configurar o shell para ativar o pyenv quando você iniciar uma sessão do terminal. Coloque as linhas abaixo no final do arquivo ~/.zshrc:
export WORKON_HOME=~/.ve
export PROJECT_HOME=~/workspace
eval "$(pyenv init -)"
#pyenv virtualenvwrapper_lazy
- Veja que tem um # na última linha do ~/.zshrc para manter o pyenv-virtualenvwrapper desativado neste primeiro momento. Voltaremos nisso mais tarde.
- Observe que eu não inclui o comando pyenv virtualenv init no ~/.zshrc contrariando o que sugere a documentação. Isso é proposital. Ativas as 2 extensões simultaneamente causa conflitos.
Agora é preciso reiniciar a sessão do terminal fechando a janela e abrindo uma nova.
Eu gosto de ter apenas uma instalação global do Jupyter Notebook, do iPython Console para Python3, do iPython Console para Python2, e de outros utilitários como youtube-dl, rename, gnucash-to-beancount, rows, s3cmd, fabric, mercurial, etc.
É para fazer estas instalações globais que uso o pyenv-virtualenv. Começo criando 4 virtualenvs especiais com o pyenv-virtualenv:
pyenv virtualenv 3.6.0 jupyter3
O Jupyter suporta vários kernels. Dessa forma uma mesma instalação do Jupyter pode permitir a criação de notebooks para Python2, Python3, R, Bash e muitas outras linguagens. Eu quero configurar apenas o suporte para Python3.
pyenv activate jupyter3
pip install jupyter
python -m ipykernel install --user
pyenv deactivate
Veja que no Python3 eu instalo o Jupyter que por padrão já instala o iPython com o Kernel também. Já no Python2 eu instalo apenas o iPython com Kernel. Explico melhor isso lá embaixo.
Finalmente, este é o momento de fazer todas essas versões do Python e virtualenvs especiais funcionarem cooperativamente:
pyenv global 3.6.0 jupyter3
O comando acima estabelece a prioridade do PATH para que os scripts sejam acessados na ordem certa, e sem precisar ficar ativando virtualenv nenhum.
Como ficam os virtualenvs dos meus projetos?
Eu uso o pyenv-virtualenvwrapper para criar os virtualenvs dos meus projetos. Esta extensão faz muito pouco. Ela apenas ajusta o virtualenvwrapper para trabalhar direito com os interpretadores instalados com o pyenv.
Este é o momento de descomentar a linha #pyenv virtualenvwrapper_lazy no seu ~/.zshrc e reiniciar o terminal fechando e abrindo a janela novamente.
Quando você abrir a nova sessão, o pyenv-virtualenvwrapper vai instalar as dependências do virtualenvwrapper se não estiverem presentes.
Agora basta usar os comandos normais do virtualenvwrapper e cada virtualenv será criado usando como base o Python adequado que eu instalei no pyenv.
-
Digamos que eu queira iniciar um projeto novo com Python3 chamado proj3. Basta executar mkproject proj3 para criar o virtualenv com Python3 (que é o padrão) em ~/.ve/proj3 e o diretório de projeto vazio em ~/workspace/proj3 .
-
Agora pense que eu acabei de abrir uma janela do terminal e quero trabalhar no projeto proj3 criado anteriormente. Basta executar workon proj3 para ativar o virtualenv ~/.ve/proj3 e entrar no diretório do projeto ~/workspace/proj3 para trabalhar.
Como usar o Jupyter e o iPython com meus projetos?
Tanto o Notebook quanto o Console eram partes do projeto iPython, que como o nome diz era focado apenas na linguagem Python. Com a evolução do Notebook, começaram a adicionar suporte para outras linguagens e para manter a casa em ordem, os desenvolvedores decidiram quebrar o projeto em 2: Jupyter e iPython
O Jupyter ficou com o Notebook, enquanto o iPython ficou com o Console e com o kernel de Python para que o Jupyter possa executar código Python.
Eu usava o iPython antigo e numa atualização desastrada me enrolei com o Jupyter, que parou de detectar o virtualenv ativo para permitir que eu importe as bibliotecas instaladas nele.
Na verdade, quem detecta o virtualenv não é o Jupyter, mas o iPython que o Jupyter inicializa.
O problema é que o código detector de virtualenv do iPython só é executado no modo console interativo, mas não no modo kernel. Dá uma olhada no culpado.
Além disso o detector do iPython só funciona quando a versão do Python que está rodando o iPython é igual à do Virtualenv ativo. (>ლ)
A solução é aproveitar que o iPython permite customizar sua inicialização e executar a detecção de virtualenv neste momento.
Para isso precisamos criar um profile padrão do iPython e instalar um arquivo de inicialização que criei para fazer essa mágica:
ipython profile create
curl -L http://hbn.link/hb-ipython-startup-script > ~/.ipython/profile_default/startup/00-venv-sitepackages.py
Com isso, sempre que o iPython for inicializado tanto no modo interativo quanto no modo kernel, o caminho para o site-packages do virtualenv estará disponível no PYTHONPATH.
Então voltando ao nosso proj3, entrando no virtualenv com o comando workon proj3, basta executar ipython para iniciar o modo interativo, ou jupyter notebook.
Pronto. Agora que está tudo está organizado, bora codar! ^‿^