Skip to content

Instantly share code, notes, and snippets.

@atmosmps
Last active November 29, 2019 20:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atmosmps/bac20c0167c7e87dda73b913279bb279 to your computer and use it in GitHub Desktop.
Save atmosmps/bac20c0167c7e87dda73b913279bb279 to your computer and use it in GitHub Desktop.
Meu guia definitivo de ambientação em Python

Meu guia definitivo de ambientação em Python

Baseado em: Guia Definitivo Para Organizar Meu Ambiente Python

Segue as adaptações para minhas necessidades:

  1. Quero poder incluir outros interpretadores como PyPy e Anaconda;
  2. O Python3 tem que ser meu padrão pra tudo.
  3. 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.
  4. Quero ter apenas um iPython Console para Python3, ou seja, nada de ficar instalando iPython no virtualenv dos meus projetos;
  5. 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.
  6. Quero usar virtualenvwrapper para os projetos que desenvolvo permitindo que eu mude de contexto/projeto rapidamente com apenas um comando.
  7. 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
  1. Veja que tem um # na última linha do ~/.zshrc para manter o pyenv-virtualenvwrapper desativado neste primeiro momento. Voltaremos nisso mais tarde.
  2. 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.

  1. 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 .

  2. 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! ^‿^

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment