Thiago Krempser

Ambientes virtuais em Python

19 Abril 2019

Neste artigo explico o que são e como criar ambientes virtuais para nossos projetos em Python.

Sumário

Por que usar ambientes virtuais?

Se você gosta de Python tanto quanto eu, é grande a chance de você trabalhar em mais de um projeto ao mesmo tempo e no mesmo computador. Quando se trabalha em vários projetos, existe a chance de você usar versões diferentes de pacotes de terceiros — chamados também de site packages, em oposição aos system packages, que são os pacotes da biblioteca padrão do Python — ou até mesmo utilizar o Python 3 em um projeto e o Python 2 em outro.

Por padrão, todo pacote Python de terceiro que você instalar em seu computador irá ser armazenado na mesma pasta. No meu computador, esta pasta é:

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages

Para descobrir onde são instalados os pacotes no seu computador, abra o interpretador do Python e digite:

import site
site.getsitepackages()

Os pacotes são em uma subpasta com seu nome, não há diferenciação por número de versão e todos os projetos usam a mesma pasta citada anteriormente para buscar os pacotes de que dependem. Assim, ao atualizar um pacote, todos os projetos que por ventura façam uso deste, passarão a ter acesso a sua versão atualizada e isto pode causar conflitos de dependência.

Para ilustrar melhor, imagine que você esteja trabalhando em um projeto que dependa da pacote “B” na versão 1.0 e imagine também que este pacote não ofereça compatibilidade com versões futuras — infelizmente, isto pode acontecer. Suponha que algum tempo depois, você passa a trabalhar em um novo projeto que também fará uso do mesmo pacote “B” e queira usar a versão mais atualizada de “B”. Mas, como o pacote não possui backward compatibility, a atualização de “B” poderá causar conflitos de dependência no seu primeiro projeto, fazendo com que ele não se comporte exatamente como o esperado. Justamente em situações como esta que os ambientes virtuais podem nos ajudar.

O que são ambientes virtuais?

Ambientes virtuais são ambientes Python assim como o Python padrão que é instalado em seu sistema operacional, mas com a grande diferença de serem isolados. Os pacotes de terceiros e o próprio interpretador Python instalados em um ambiente virtual são exclusivos do mesmo e não podem ser acessados por outros ambientes virtuais e nem pelo Python padrão do sistema operacional. A grande vantagem desse isolamento dos ambientes virtuais é evitar a ocorrência de conflitos de dependência como aquele explicado na seção anterior.

Criando um ambiente virtual

No Python 3, para criar um ambiente virtual executamos no terminal (prompt de comando):

python3 -m venv my_venv

Com este comando, um ambiente virtual com o nome my_venv será gerado na forma de uma pasta com a seguinte estrutura:

my_venv/
├── bin
│   ├── activate
│   ├── pip
│   ├── python
│   └── ...
│   ...
└── lib
       └── python3.7
           └── site-packages
            └── ...

A pasta bin contém o interpretador python, o gerenciador de pacotes pip e outros arquivos usados para interagir com o ambiente virtual, como o activate que serve para ativar o ambiente virtual. Na pasta lib temos o subpasta site-packages na qual são gravados todos pacotes de terceiros que são obtidos pelo gerenciador de pacotes pip. Todos estes arquivos trabalhando em conjunto, garantem o isolamento do ambiente virtual.

Ativando o ambiente virtual

Para usar um ambiente virtual, é necessário ativá-lo usando o script activate conforme já adiantado na seção anterior. Para tal, basta executar:

source my_env/bin/activate

Após a execução, você notará que o prompt do seu terminal possui agora começa com (my_venv), isto quer dizer que você ativou seu ambiente virtual com sucesso e agora está trabalhando em um ambiente Python isolado daquele que está instalado em seu sistema operacional — e também de outros ambientes virtuais caso existam.

Desativando o ambiente virtual

Para desativar seu ambiente virtual e voltar a usar o interpretador Python e os pacotes instalados no seu sistema operacional globalmente, execute:

deactivate

Você notará que o prefixo (my_venv) que havia no prompt de comando do seu terminal não existe mais, o que indica que você está utilizando o ambiente global.

Lembre-se sempre de desativar seu ambiente virtual quando terminar de trabalhar no projeto ao qual pertence o mesmo, evitando assim que sejam instalados pacotes que não serão usados em seu projeto.

Testando o ambiente virtual

Finalmente para vermos de fato o funcionamento do ambiente virtual que criamos, vamos instalar um pacote globalmente e testar se o mesmo ficará acessível em nosso ambiente virtual.

Com o ambiente virtual desativado, execute o comando abaixo para instalar o pacote requests — que possui funcionalidades que facilita a manipulação de requisições HTTP, mais informações sobre ele aqui.

pip -q install requests

Nesta linha de comando, usamos o gerenciador de pacotes do Python chamado pip, você pode encontrar mais informações sobre ele em sua documentação.

Após a instalação, verifique que o pacote requests foi instalado usando o comando para listar os pacotes instalados pelo pip:

pip list

Agora, ative o ambiente virtual criado anteriormente, fazendo:

source my_env/bin/activate

Execute novamente o comando do pip para visualizar os pacotes instalados em seu ambiente virtual:

pip list

Veja que o pacote requests não consta na lista, ou seja, nosso ambiente virtual está isolado do ambiente global do sistema operacional.

Conclusão

Neste artigo, você aprendeu como os problemas de dependência são resolvidos em Python com o conceito dos ambientes virtuais.

Na medida em que você for evoluindo como programador Python e tiver que trabalhar em vários projetos ao mesmo tempo, você sentirá a necessidade de isolar suas dependências. Entretando, eu recomendo fortemente que você aprenda e utilize os ambientes virtuais o quanto antes, não espere que surjam conflitos de versões entre seus pacotes — faça da forma correta desde o início.


Thiago Krempser

Artigos sobre Python, Django e resumos de livros.
Por Thiago Krempser. Github.