Ambientes virtuais e pacotes
Até agora fizemos um script independente, o nosso hello.py
, que não possui
dependências e pode rodar em qualquer ambiente com Python.
Porém, conforme nossos programas ficam mais complexos, acabamos utilizando soluções prontas do ecossistema Python, o PyPI, repositório de pacotes que oferece mais de 300 mil pacotes para reutilizar.
Qual o Problema?
Se instalarmos as bibliotecas do PyPI diretamente no Python principal do sistema podemos criar conflitos e deixar o ambiente muito cheio de bibliotecas que podem se tornar obsoletas.
Para resolver esse problema, o recomendado é criarmos um sandbox, um ambiente separado onde podemos ter uma cópia do ambiente Python isolada onde não corremos o risco de criar conflitos.
Ambiente Real
Para saber qual é o ambiente real do Python, utilize o seguinte comando:
python3 -m site
Este comando retorna os caminhos de instalação do Python e suas bibliotecas, para criar um ambiente virtual a partir destes arquivos basta copiarmos tudo isso para um novo local isolado.
Como este processo é algo bastante comum de ser feito, o próprio Python já vem com uma ferramenta que faz essa cópia automaticamente.
Ambiente Virtual
O ambiente virtual é um sandbox, é uma cópia de todo o ambiente Python. A recomendação é que você tenha um ambiente virtual em cada um dos seus projetos; cada projeto deve usar seu próprio conjunto de bibliotecas isoladamente.
Criando o Ambiente Virtual
Na pasta do seu projeto, usamos o módulo venv
e informamos um nome para a
pasta do ambiente ser criada, é comum que o nome seja .venv
pois o .
torna
a pasta oculta no seu sistema e esse nome é comumente adotado.
cd python-base
python3 -m venv .venv
Ao executar esse comando, irá notar que foi criada uma nova pasta
chamada .venv
e dentro dela tem a cópia de todos os arquivos do Python.
$ ls -a .venv
. .. bin include lib lib64 pyvenv.cfg share
Ali dentro da pasta bin
é onde encontramos o python
e também outras
ferramentas como o pip
e a partir de agora todos os módulos que instalarmos
vão para dentro da pasta lib
.
Mas para usar o ambiente virtual sempre será necessário efetuar a ativação, no Linux isso é feito com o comando abaixo:
source .venv/bin/activate
Ao rodar o activate
o seu prompt passa a exibir (.venv)
que é o nome do
ambiente virtual, e para se certificar execute novamente o módulo site
.
python3 -m site
Repare que agora os caminhos de bibliotecas (1 e 4 da lista) apontam para a pasta isolada do seu projeto.
Outra forma de verificar qual ambiente Python está ativado é usando o
comando which
.
which python
O retorno deve ser algo como ~/Projects/python-base/.venv/bin/python
.
IMPORTANTE: Sempre que abrir um terminal, antes de executar os comandos,
você deverá ativar o ambiente virtual do seu projeto. Existem ferramentas que
podem fazer isso automaticamente para você como o zsh
ou o poetry
.
Git Ignore
Em nosso projeto agora temos uma nova pasta .venv
com centenas de arquivos e
se fizermos um commit + push usando o git iremos mandar essa pasta toda para o
repositório remoto do GitHub e queremos evitar isso, a .venv
é apenas para
uso local, se outra pessoa precisar executar seu código ela terá que criar o
ambiente virtual diretamente lá no ambiente que precisar.
Crie um arquivo chamado .gitignore
na raiz do projeto
cd python-base
touch .gitignore
O comando touch
do Linux cria um arquivo vazio e então você pode abrir ele
com o seu editor para adicionar as pastas que queremos que fiquem de fora do
controle do git.
Basta abrir o .gitignore
e adicionar a linha:
.venv
Uma outra forma mais fácil de fazer isso é com este comando:
echo ".venv" >> .gitignore
O comando acima adiciona o texto .venv
no final do arquivo .gitignore
.
Desta forma evitamos que a pasta venv vá para o git mas agora você precisa
fazer um commit para adicionar o .gitignore
.
git add .gitignore
git commit -m "adicionado git ignore"
git push
Instalando Pacotes
Agora sim podemos instalar pacotes dentro do nosso ambiente virtual :)
Primeiro certifique-se de que (.venv)
aparece em seu terminal ou
que which python
mostra o Python de dentro da pasta .venv
.
Agora a primeira coisa a fazer é usar o pip
que é o gerenciador de pacotes do
Python e através dele podemos instalar novas bibliotecas e ferramentas.
Atualize o próprio pip
python3 -m pip install --upgrade pip
Com o pip atualizado vamos instalar nosso primeiro pacote e ele se chama IPython
python3 -m pip install ipython
O Ipython é uma versão do interpretador Python que possui mais funcionalidades.
Digite ipython
e perceba como ele é um pouco diferente do terminal que usamos
anteriormente.
$ ipython
Python 3.10.2 (main, Jan 15 2022, 19:56:27) [GCC 11.1.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.0.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
É bastante similar, a única grande diferença que vai notar é que ao invés de
exibir o prompt padrão >>>
, ele agora mostra In [1]:
e fica à espera de
alguma instrução. Experimente digitar 1 + 1
In [1]: 1 + 1
Out[1]: 2
Repare que a resposta vem em um novo prompt contendo Out [1]:
e isso é
bastante poderoso, pois ele grava um histórico de todos os seus comandos e você
pode, por exemplo, digitar _1
ou _2
etc. para acessar o retorno de algum
comando que digitou anteriormente.
Além disso, o IPython possui uma ajuda mais completa usando ?
ou ??
ao
invés de usar help()
In [4]: print?
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Type: builtin_function_or_method
E também oferece auto-complete. Experimente começar a digitar, por exemplo, a
letra p
e depois pressionar tab
e ele vai te mostrar um seletor com todos
os objetos começados pela letra p
.
In [5]: p<tab>
pass %page %pdef %pinfo %pprint %psearch %pycat %%python2
pow() %paste %pdoc %pinfo2 %precision %psource %pylab %%python3
print() %pastebin %%perl %pip %prun %pushd %%pypy
property %pdb %pfile %popd %%prun %pwd %%python
Recomendo que em todos os seus ambientes virtuais você adicione o IPython :)