Ambientes virtuais
Inscreva-se na newsletter
Receba os novos tutoriais e faça parte da comunidade iafluente
!
A modularidade é uma das grandes maravilhas do software.
Por exemplo, para construir um modelo de machine learning (ML), no mínimo é preciso ler dados, manipulá-los, definir um modelo, treiná-lo e avaliá-lo.
A beleza da modularidade está no fato de não ser necessário resolver novamente problemas que já foram resolvidos.
Não é preciso começar do zero para construir o modelo de ML. Existem soluções para cada uma das etapas mencionadas individualmente. Você pode importar bibliotecas como pandas
, numpy
, scikit-learn
, dentre tantas outras e compor a sua solução.
A modularidade traz consigo uma consequência importante:
O código que você escreve/executa (quase) nunca vive isolado. Ele possui dependências, isto é, vive em um ambiente.
Se você pensa em construir algo que vai ser utilizado por um longo período e/ou que vai envolver um número significativo de pessoas, o ambiente em que seu programa vai ser executado deve ser uma das suas primeiras considerações.
Neste tutorial, vou te ensinar a gerir o ambiente utilizado pelo seu programa em Python.
O que é o “ambiente”?
Neste tutorial, utilizo o termo “ambiente” para me referir ao conjunto de dependências (a grosso modo, bibliotecas) que o seu programa em Python utiliza ao ser executado.
Por exemplo, se você acabou de instalar o Python no seu computador, você utilizará o ambiente padrão, chamado de base
.
Como interagir com o ambiente?
Existem diferentes formas de interagir com o ambiente Python, sendo a mais comum pela linha de comando — Terminal, no Mac e Linux, ou PowerShell, no Windows.
Perceba que, na imagem acima, há base
escrito entre parênteses. Isso indica que estamos no ambiente padrão.
Para instalar bibliotecas em Python, uma das ferramentas mais utilizadas é o pip
. Por exemplo, se você executar:
a versão 1.2 de numpy
será instalada. Se estamos no ambiente base
, é nele que a instalação está sendo feita.
Para conferir que a versão especificada de numpy
realmente foi instalada, basta executar o comando pip show
:
Para desinstalar a biblioteca, basta executar:
Ambientes virtuais
Na última seção, vimos como interagir com o ambiente base
utilizando o pip
para instalar e desinstalar bibliotecas.
Se você trabalhasse sozinho e o seu objetivo fosse rodar um único programa algumas poucas vezes, você poderia continuar usando o ambiente base
sem grandes problemas.
Porém, na prática, um software é construído por mais de uma pessoa. Além disso, a ideia é que um programa seja executado um número indeterminado de vezes.
Você entende o desafio de continuar usando o ambiente base
nesse contexto?
Se cada desenvolvedor rodar o código no seu ambiente base
— cada um com versões de bibliotecas diferentes — é muito provável que inconsistências e erros apareçam. Seria impossível trabalhar em equipe.
Além disso, se o código fosse executado muitas e muitas vezes e atualizássemos a versão de alguma das dependências sem muito cuidado, é quase certo que ele eventualmente parasse de funcionar.
Isso motiva a necessidade de se utilizar ambientes virtuais.
Ambientes virtuais são ambientes Python isolados uns dos outros. Em vez de sempre utilizar o ambiente
base
, você pode criar um ambiente virtual para cada projeto: cada um com as bibliotecas e versões esperadas pelo programa específico.
Por exemplo, se você tem um projeto que utiliza pandas==1.4.4
e outro que utiliza pandas==1.2
, não há problema algum! Basta criar ambientes virtuais para cada projeto, instalar as versões de pandas
correspondente e executar os programas no respectivo ambiente.
Ambientes virtuais possibilitam a colaboração, porque cada desenvolvedor pode criar um ambiente virtual idêntico em sua respectiva máquina.
Gerindo ambientes virtuais com conda
Conda e venv são as ferramentas frequentemente utilizadas para gerir ambientes virtuais em Python. O passo-a-passo de utilização das duas ferramentas é bem semelhante. Neste texto, vou mostrar como gerenciar um ambiente virtual com conda.
Para isso, assumo que você seguiu os passos de instalação especificados aqui.
Vamos ao passo-a-passo:
-
Criar. Para criar um ambiente, basta usar o comando conda create. Por exemplo, para criar um ambiente chamado iafluente, basta executar seguinte no terminal:
Se você quiser ser ainda mais preciso e especificar a versão de Python nesse ambiente (neste caso, Python 3.9), você pode executar:
-
Ativar. Logo após a criação, o ambiente ainda não está ativado. Você consegue ver qual ambiente está ativado vendo o nome entre parênteses no terminal.
No caso, ainda é o ambiente
base
. Para ativar o ambiente que acabamos de criar, basta executar:Depois do comando acima, você deve ver o terminal com:
Isso significa que o ambiente está ativado!
-
Instalar bibliotecas. Com o ambiente ativado, tudo que você instalar naquela janela do terminal será instalado no ambiente virtual
iafluente
. Por exemplo, se você executar:a versão 1.2 de
numpy
será instalada no seu ambienteiafluente
— e não nos demais ambientes que você tem, como o ambientebase
.Ainda com o ambiente ativado, se você executar um programa Python, este rodará no ambiente que criamos. Por exemplo, para executar um script chamado
meu_programa.py
no ambiente, basta:Alternativamente, se você quiser usar um Jupyter Notebook neste ambiente, basta executar com o ambiente ativado:
Encontrou o erro
command not found: jupyter
?Esse erro nos diz que o módulo
jupyter
não está instalado no ambiente que estamos utilizando — chamado deiafluente
. Para resolvê-lo, basta instalar o jupyter compip install jupyter
e em seguida executar jupyter notebook novamente. -
Desativar. Para sair do ambiente e voltar para o ambiente
base
, basta usar:Depois do comando acima você deve ver
base
novamente entre parênteses no terminal. -
Reativar. Para voltar ao ambiente
iafluente
ou qualquer outro que você já tenha criado, basta usar oconda activate
com o nome do ambiente, como no passo 2.
Com os comandos acima, você consegue fazer 99% das coisas que na prática se precisa fazer com um ambiente virtual.
Arquivos requirements.txt
Ao longo de todo o texto, instalamos bibliotecas no ambiente uma a uma. Isto é, para instalar numpy==1.2
, executamos pip install numpy==1.2
. Depois, para instalar pandas==1.4
, executamos pip install pandas==1.4
.
Esse processo é lento e propenso a erros. Por isso, quase todo projeto tem um arquivo chamado requirements.txt
.
Este arquivo de texto contém todas as dependências necessárias para executar o código do projeto. Um exemplo de um bom arquivo requirements.txt
é:
Porque o arquivo requirements.txt
acima é bom
Algumas características que considero boas no arquivo acima:
-
Está organizado em ordem alfabética. Projetos complexos podem ter arquivos
requirements.txt
extensos. Nestes casos, seguir a ordem alfabética facilita encontrar. Quando necessário, comentários também são bem-vindos. -
As versões das dependências estão especificadas. As versões são imprescindíveis para garantir que os ambientes sejam reproduzíveis.
-
Não está inflado com “dependências das dependências”. Algumas pessoas utilizam o comando
pip freeze > requirements.txt
para gerar o arquivorequirements.txt
automaticamente. Quando isso é feito, é comum que o arquivo fique demasiadamente inflado. Existem alternativas melhores, comopipreqs
, porém, muitas vezes o melhor é manter o arquivorequirements.txt
manualmente.
Para instalar tudo que está especificado no requirements.txt
basta ativar o ambiente (passo 2, na seção anterior) e em seguida: