Pesquisa de site

Codifique mais, depure menos com ambientes virtuais em Python


Proteja-se contra surpresas inesperadas e indesejáveis usando venv em Python.

Se você já compartilhou um truque de computador bacana, um aplicativo complexo ou algo parecido com um amigo, provavelmente já pronunciou a frase: "Bem, funciona no meu computador". Não importa quão avançados os computadores se tornem, parece haver problemas recorrentes relacionados às diferenças no que duas máquinas configuram ou instalam. Existem tentativas contínuas de resolver isso e, para desenvolvedores Python, uma das melhores maneiras de evitar isso é usar ambientes virtuais.

O comando para criar um ambiente virtual em Python é:

$ python -m venv ./myproject

Para ativar um ambiente virtual:

$ source ./myproject/bin/activate
(myproject)$ 

Para instalar os módulos necessários:

(myproject)$ python -m pip install -r requirements.txt

Para desativar um ambiente virtual:

(myproject)$ deactivate

Os ambientes virtuais são uma parte importante do processo de desenvolvimento Python. Aprenda a usá-los para proteger você e seus usuários contra surpresas inesperadas e indesejáveis. Resumindo, use ambientes virtuais para poder gastar mais tempo codificando e menos tempo depurando!

Ambientes virtuais em Python

Um ambiente virtual é um ajuste temporário na forma como o Python executa o código. Um ambiente virtual não é uma máquina virtual, nem é exatamente um contêiner. Na verdade, um ambiente virtual manipula as variáveis de ambiente do seu shell para que você possa executar uma versão conhecida do Python usando um conjunto local de módulos.

Vida sem ambientes virtuais

Sem um ambiente virtual, quando você digita python ou python3 em seu terminal, você está iniciando qualquer versão do Python instalada em seu computador:

$ python --version
Python 2.7.17
$ python3 --version
Python 3.7

Na segunda-feira, esta pode ser a versão X, mas na terça-feira, de repente, pode ser o Python Y, caso você atualize seu computador durante a noite. Muitas vezes, isso não é um problema porque o Python tende a ser bom em compatibilidade com versões anteriores. No entanto, alguns computadores mantêm versões muito antigas do Python no interesse do suporte legado, e alguns desenvolvedores escrevem sobre o que há de mais moderno em seu desejo de usar os recursos mais recentes da linguagem. Isso pode causar problemas inesperados.

O mesmo problema se estende a módulos Python individuais. Você pode instalar a versão Z do módulo ExamplePyMod, desenvolver seu código e publicar seu aplicativo online. Se alguém que instalou a versão X ou Y do ExamplePyMod há um ano tentar executar seu código, poderão surgir problemas de compatibilidade inesperados. Também é um problema comum para os desenvolvedores considerarem um módulo garantido. Se você usa um módulo com tanta frequência que praticamente pensa nele como parte do Python, provavelmente se esquecerá de adicionar o módulo como um requisito para executar seu aplicativo.

Em ambos os casos, para encontrar a causa raiz dos erros, você terá que auditar e atualizar seu sistema ou o sistema do usuário para que ambos executem as mesmas versões de tudo o que está envolvido.

Usando ambientes virtuais em Python

Um ambiente virtual redireciona temporariamente as chamadas do Python para uma versão específica do Python. Por exemplo, usar a versão Python 3.7 para criar um ambiente virtual garante que python aponte para Python 3.7, não para Python 2.7 ou Python 3.8 ou qualquer outra coisa que você possa ter em sua máquina de desenvolvimento.

Por exemplo, aqui está um ambiente virtual criado com Python 3.7:

# no virtual environment
$ python --version
Python 2.7.17

# virtual environment
$ python3.7 -m venv example37/venv
$ cd example37
$ source ./venv/bin/activate
(venv)$ python
Python 3.7
(venv)$ deactivate

# no virtual environment
$ python --version
Python 2.7.17

Usando módulos em um ambiente virtual

Os módulos são instalados localmente no ambiente virtual. Ao trabalhar em um ambiente virtual, você pode instalar o ExamplePyMod e usá-lo o dia todo, mas ele desaparecerá quando você sair do ambiente virtual.

Aqui está o processo de instalação do módulo:

# no virtual environment
$ python3
>>> import flask
ModuleNotFoundError: No module named 'flask'

# virtual environment
(venv)$ python -m pip install flask
[...]
(venv) bash-4.3$ python -m pip install flask
Collecting flask
  Downloading [...]
Successfully installed [...]
(venv)$ python
>>> from flask import Flask
>>> app = Flask(__name__)
(venv)$ deactivate

# no virtual environment again
$ python3
>>> import flask
ModuleNotFoundError: No module named 'flask'

Restaurando um ambiente virtual com pip

Pode parecer muito trabalho extra instalar e reinstalar os módulos necessários toda vez que você se senta para hackear o código. Na verdade, o sistema de ambiente virtual incentiva você a acompanhar os módulos que está usando em um arquivo requirements.txt dentro do diretório do seu projeto. Você pode processar requirements.txt com pip para lidar com instalações automatizadas de todas as dependências:

$ cd myproject
$ source ./venv/bin/activate
(venv)$ python -m pip install -r requirements.txt
Installed [...]
$ python
>>> from flask import Flask
>>> import examplepymod

O Python também armazena em cache os módulos necessários, para que você esteja pronto e funcionando rapidamente.

Para uma visão geral completa do pip e suas habilidades, baixe o cheatsheet do pip de Moshe Zadka.

Artigos relacionados: