Como usar Ambientes Virtuais em Python — Parte 1

Ricardo Grego
Data with Science & Analytics
5 min readMay 24, 2023

Este artigo foi editado em 2-ago-2023 inserindo o trecho sobre soluções alternativas à escolha por Conda e Pip.

Se você trabalha com programação em Python, sabe o quão poderosos e versáteis são os pacotes, também chamados de bibliotecas, disponíveis para essa linguagem. E se trabalha com diversos projetos na mesma máquina (e a resposta provavelmente é “sim”), é fundamental aprender a utilizar ambientes virtuais, uma ferramenta que permite criar ambientes isolados para cada projeto, evitando conflitos de pacotes e facilitando a reprodutibilidade do código.

Na Parte 1 deste artigo abordamos os conceitos básicos sobre ambientes virtuais e as necessidades de utilizá-los.

Na Parte 2 explicamos o passo a passo para implementar ambientes virtuais em Python e utilizá-los tanto em linha de comando quanto no VS Code.

Pacotes, versões e gerenciamento

Os pacotes são bibliotecas com funções pré-programadas que podem ser utilizadas em seus projetos. Eles são essenciais para tornar a linguagem Python mais versátil e eficiente, pois permitem que sejam utilizadas funções prontas em vez de ter que escrevê-las do zero. Alguns pacotes até utilizam funções de outros pacotes que, por sua vez, podem usar funções de mais outros, criando uma rede de dependência entre eles.

Quando um pacote é atualizado, algumas funções podem ser alteradas, e isso pode quebrar algum código que esteja usando uma função da versão anterior. Isso pode, inclusive, torná-lo incompatível com algum outro pacote que faça uso dele. Para lidar com esse problema, é necessário utilizar um “gerenciador de pacotes”, que verifica se todas as dependências estão funcionando corretamente e, quando necessário, atualiza os pacotes para as versões corretas para o funcionamento adequado de todos.

https://xkcd.com/1987/

Já viu onde isso pode chegar, né?

Quando tudo quebra

Vamos para uma situação hipotética (e mais comum que gostaríamos): você faz um projeto e o deixa funcionando perfeitamente. Pouco tempo depois começa a desenvolver outro projeto que usa alguns pacotes em comum com o projeto anterior, mas precisa instalar outros pacotes, que por sua vez dependem de versões mais atualizadas daqueles que você já tinha instalado. Seu gerenciador de pacotes, então, atualiza a versão antiga dos pacotes já instalados, deixando todos os pacotes nas versões corretas para satisfazer todas as dependências.

Cenário final: seu novo projeto funciona perfeitamente, mas seu projeto anterior quebrou, pois usa algumas funções que foram descontinuadas nas versões mais recentes dos pacotes.

E se existisse uma forma de criar um projeto novo com versões atualizadas de pacotes e manter isolado o projeto anterior?

Ambientes Virtuais

A comunidade Python resolveu este problema com os chamados Ambientes Virtuais, que mantém ambientes isolados com suas próprias versões de cada pacote, e inclusive com versões diferentes do interpretador Python.

Essa solução resolve tanto o problema de projetos antigos continuarem funcionando sem serem atualizados desnecessariamente quanto o de permitir reprodutibilidade do projeto, afinal você pode compartilhar com o projeto as versões exatas de cada pacote instalado no seu ambiente.

Existem várias formas de se executar essa solução, até porque estamos falando não só de gerenciamento de pacotes, mas também da criação e do gerenciamento de ambientes virtuais. Entre as que pesquisei, a que achei mais eficiente foi usando duas ferramentas:

  1. Conda para gerenciar ambientes virtuais.
  2. Pip para gerenciar pacotes dentro dos ambientes.

O que são Pip e Conda?

Pip é uma ferramenta para instalação e gerenciamento de pacotes disponíveis no PyPI (Python Package Index). O PyPI é o maior repositório de pacotes para Python com mais de 150 mil pacotes disponíveis. O Pip tem a vantagem de ser simples e já estar integrado na instalação do Python desde a versão 3.4.

O Conda gerencia pacotes do repositório Anaconda e do Anaconda Cloud, que contam com mais de 1.500 pacotes, com foco em aplicações para Ciência de Dados, Aprendizado de Máquina e frameworks de Inteligência Artificial.

Apesar de dar acesso a bem menos pacotes do que o Pip, o Conda é cross-plataforma e pode gerenciar pacotes de C, C++, R ou qualquer outro software. O Conda também tem nativo o gerenciamento de ambientes virtuais, que funciona não só para Python, mas também para outras linguagens. Além disso, tem um mecanismo de verificação de dependências um pouco mais eficiente do que o Pip.

Então usaremos o Conda para gerenciar ambientes virtuais e o Pip para gerenciar pacotes dentro de cada ambiente.

Soluções Alternativas

Por que não usar o Conda também para gerenciamento de pacotes?

Certa vez eu precisei de um pacote para Machine Learning e a versão do pacote no Pip havia sido atualizada havia menos de 1 mês, e no Conda o mesmo pacote estava diversas versões atrás, com última atualização com 10 meses de atraso. Isso me fez passar a considerar fortemente mudar do gerenciamento de pacotes pelo Conda para o Pip.

Por que não usar o Venv para gerenciamento de ambientes virtuais?

O Venv é um gerenciador de ambientes virtuais que já vem integrado na instalação do Python nas versões mais recentes.

Ele exige que se crie um diretório dentro do diretório do projeto em que se está trabalhando. Por um lado, isso é uma facilidade para quem trabalha com projetos e quer/precisa ter o projeto e seu ambiente virtual juntos, portáveis facilmente. É uma visão mais próxima à atividade de desenvolvimento de software.

Para quem trabalha com foco maior na exploração e análise de dados, que é o meu caso, eu considero que o Conda é mais adequado. Independente do diretório de projeto em que estou posso ativar qualquer um dos ambientes virtuais do Conda, de forma intercambiável.

Eu tenho um ambiente chamado play feito para nele serem instalados diversos pacotes novos, testar, sem a pretensão do ambiente ser estável, e se ele começar a dar problema eu o apago e crio novamente. Já no ambiente ml eu mantenho as bibliotecas de Machine Learning prontas para serem utilizadas em qualquer exploração de dados, de qualquer projeto (um único ambiente virtual que pode ser utilizado em diversos projetos). Em um mesmo projeto eu tenho notebooks que rodam usando ambientes virtuais diferentes, dependendo se o que eu estou fazendo é testar pacotes para conectar a um servidor remoto ou se será a análise exploratória dos dados obtidos.

Em resumo, o Venv pode ser melhor para um uso mais próximo ao desenvolvimento de projetos, e o Conda funciona muito bem para uma aplicação rápida e imediata a diversos projetos que possam precisar de um mesmo conjuntos de pacotes.

Execução

Agora que entendemos para que servem os ambientes virtuais e como funcionam, na Parte 2 veremos como utilizá-los.

--

--

Ricardo Grego
Data with Science & Analytics

Data Science & Analytics || A curious person. Being curious about learning, parenting, data science, fintech, edtech, neuroscience and health.