Pular para conteúdo

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.

Diagrama de blocos com dependências

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.

Ambiente virtual base no terminal

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:

Sessão no terminal
pip install numpy==1.2

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:

Sessão no terminal
pip show numpy

Para desinstalar a biblioteca, basta executar:

Sessão no terminal
pip uninstall numpy

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:

  1. Criar. Para criar um ambiente, basta usar o comando conda create. Por exemplo, para criar um ambiente chamado iafluente, basta executar seguinte no terminal:

    Sessão no terminal
    conda create -n iafluente
    

    Se você quiser ser ainda mais preciso e especificar a versão de Python nesse ambiente (neste caso, Python 3.9), você pode executar:

    Sessão no terminal
    conda create -n iafluente python=3.9
    
  2. 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.

    Sessão no terminal
    (base) ~ »
    

    No caso, ainda é o ambiente base. Para ativar o ambiente que acabamos de criar, basta executar:

    Sessão no terminal
    conda activate iafluente
    

    Depois do comando acima, você deve ver o terminal com:

    Sessão no terminal
    (iafluente) ~ »
    

    Isso significa que o ambiente está ativado!

  3. 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:

    Sessão no terminal
    pip install numpy==1.2
    

    a versão 1.2 de numpy será instalada no seu ambiente iafluente — e não nos demais ambientes que você tem, como o ambiente base.

    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:

    Sessão no terminal
    python meu_programa.py
    

    Alternativamente, se você quiser usar um Jupyter Notebook neste ambiente, basta executar com o ambiente ativado:

    Sessão no terminal
    jupyter notebook
    
    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 de iafluente. Para resolvê-lo, basta instalar o jupyter com pip install jupyter e em seguida executar jupyter notebook novamente.

  4. Desativar. Para sair do ambiente e voltar para o ambiente base, basta usar:

    Sessão no terminal
    conda deactivate
    

    Depois do comando acima você deve ver base novamente entre parênteses no terminal.

  5. Reativar. Para voltar ao ambiente iafluente ou qualquer outro que você já tenha criado, basta usar o conda 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 é:

Arquivo requirements.txt
numpy==1.2
pandas==1.4
scikit-learn==1.0
Porque o arquivo requirements.txt acima é bom

Algumas características que considero boas no arquivo acima:

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

  2. As versões das dependências estão especificadas. As versões são imprescindíveis para garantir que os ambientes sejam reproduzíveis.

  3. Não está inflado com “dependências das dependências”. Algumas pessoas utilizam o comando pip freeze > requirements.txt para gerar o arquivo requirements.txt automaticamente. Quando isso é feito, é comum que o arquivo fique demasiadamente inflado. Existem alternativas melhores, como pipreqs, porém, muitas vezes o melhor é manter o arquivo requirements.txt manualmente.

Para instalar tudo que está especificado no requirements.txt basta ativar o ambiente (passo 2, na seção anterior) e em seguida:

Sessão no terminal
pip install -r requirements.txt