Pular para o conteúdo principal

Virtualenv e Pip

Apesar do python ter uma bela biblioteca padrão, ainda falta muita coisa, principalmente quando se fala de aplicações científicas ou de ciências de dados. O que torna o Python tão popular nessas áreas não são apenas as características positivas da linguagem. Tão relevante quanto, são as bibliotecas externas associadas a essas áreas. As bibliotecas básicas foram abordadas brevemente na aula 08 do curso:

Por mais interessantes e abrangentes que essas bibliotecas sejam, elas ainda fornecem a funcionalidade básica para a área científica e de ciência de dados. Mas isso não se restringe apenas a esses setores importantes: Python é muito maior que a linguagem em si e sua biblioteca padrão. Lembrem-se do tamanho imenso de distribuições de Python como Anaconda ou WinPython.

É difícil de imaginar alguma área onde não existam aplicativos e bibliotecas Python. Mas esta variedade e diversidade precisa ser gerenciada de alguma maneira. Foi-se o tempo em que cada projeto tinha uma página web e disponibilizava para download os arquivos do projeto. Essa abordagem se tornou insustentável quando começaram a surgir pacotes que dependiam de outros pacotes e assim por diante.

Hoje a comunidade Python tem ferramentas para gerenciar isso: PyPI.

PyPI: Python Package Index https://pypi.org/

O PyPI é um repositório que centraliza software relacionado com a linguagem Python. o PyPI ajuda você a encontrar e instalar software desenvolvido e compartilhado pela comunidade Python.

No momento em que escrevo isso, existem 368.139 projetos cadastrados. Mas o PyPI não é apenas um portal web para software Python. Está associado a ferramentas que

  • Ajudam a instalar o pacote
  • Ajudam a instalar as dependências dos pacotes
  • Ajudam a compilar e gerenciar dependências binárias (em geral códigos escritos C/C++/Fortran)
  • Ajudam a gerenciar o software e suas versões

Instalando software com pip

A ferramente básica para instalação de pacotes python é o pip. Originalmente uma ferramente independente, hoje é parte da instalação básica do Python.

Para instalar o numpy, basta abrir um terminal e executar o seguinte comando:

pjabardo@makhno:~/temp$ python -m pip install numpy
Collecting numpy
  Using cached numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.8 MB)
Installing collected packages: numpy
Successfully installed numpy-1.22.3

Muitas vezes existe um programa chamada pip e não precisamos digitar o python -m pip. Assim, para instalar um pacote (scipy agora) podemos fazer:

pjabardo@makhno:~/temp$ pip install scipy
Collecting scipy
  Using cached scipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (42.1 MB)
Requirement already satisfied: numpy<1.25.0,>=1.17.3 in ./pacotes/lib/python3.9/site-packages (from scipy) (1.22.3)
Installing collected packages: scipy
Successfully installed scipy-1.8.0

Tanto o numpy quanto o scipy usam bibliotecas em C/C++/Fortran mas o pip e toda a infraestrutura por trás no PyPI tomam conta disso. A não ser que você esteja trabalhando em uma plataforma pouco usual, você não terá problema com essas dependências binárias.

Uma outra coisa legal do pip é que ele baixa também todas as dependências de um projeto. Vamos usar como exemplo a biblioteca matplotlib:

pjabardo@makhno:~/temp$ pip install matplotlib
Collecting matplotlib
  Using cached matplotlib-3.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (11.2 MB)
Collecting pyparsing>=2.2.1
  Using cached pyparsing-3.0.7-py3-none-any.whl (98 kB)
Collecting cycler>=0.10
  Using cached cycler-0.11.0-py3-none-any.whl (6.4 kB)
Collecting pillow>=6.2.0
  Using cached Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB)
Collecting kiwisolver>=1.0.1
  Using cached kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.6 MB)
Collecting packaging>=20.0
  Using cached packaging-21.3-py3-none-any.whl (40 kB)
Collecting python-dateutil>=2.7
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Requirement already satisfied: numpy>=1.17 in ./pacotes/lib/python3.9/site-packages (from matplotlib) (1.22.3)
Collecting fonttools>=4.22.0
  Using cached fonttools-4.31.2-py3-none-any.whl (899 kB)
Collecting six>=1.5
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, pyparsing, python-dateutil, pillow, packaging, kiwisolver, fonttools, cycler, matplotlib
Successfully installed cycler-0.11.0 fonttools-4.31.2 kiwisolver-1.4.2 matplotlib-3.5.1 packaging-21.3 pillow-9.1.0 pyparsing-3.0.7 python-dateutil-2.8.2 six-1.16.0

A biblioteca matplotlib usa a funcionalidade de outras bibliotecas como

  • pyparsing
  • cycler
  • pillow
  • E ainda alguns outros pacotes

Pode se ver acima que o pip baixou e instalou no lugar correto estas dependências.

Neste momento é possível imaginar um potencial problema na instalação de pacotes. Cada pacote é, em geral, desenvolvido de maneira independente. Novas funcionalidades podem ser acrescentadas, funcionalidade pode ser retirada e, muito comum, modificada. O problema nesse caso é que se você está usando um pacote que usa uma determinada versão de um outro pacote, se este outro pacote for modificado de maneira incompatível com a versão original, nada mais vai funcionar.

Para este tipo de situação, muito mais comum do que você pode imaginar, a comunidade Python criou uma outra ferramenta: virtualenv, hoje uma funcionalidade básica incorporada ao python.

Esta ferramente cria um ambiente onde o usuário pode instalar pacotes sem interferir diretamente na instalação básica do python. O usuário pode criar esse ambiente virtual na sua própria conta (recomendado) sem ter acesso de administrador da máquina. O usuário pode criar quantos ambiente virtuais quiser, geralmente um para cada projeto que ele estiver trabalhando.

Vamos criar um ambiente virtual para aplicações científicas. Para mostrar o que acontece vou criar um ambiente virtual chamado ciencia dentro de uma pasta vazia chamada pasta:

pjabardo@makhno:~/pasta$ ls
pjabardo@makhno:~/pasta$ python -m venv ciencia
pjabardo@makhno:~/pasta$ ls
ciencia
pjabardo@makhno:~/pasta$ ls ciencia/
bin  include  lib  lib64  pyvenv.cfg  share
pjabardo@makhno:~/pasta$ ls ciencia/bin/
activate      activate.fish  easy_install      pip   pip3.9  python3
activate.csh  Activate.ps1   easy_install-3.9  pip3  python  python3.9

O comando python -m venv ciencia, cria uma pasta ciencia dentro da pasta pasta como se pode ver acima. Dentro desta pasta, são criadas sub-pastas onde o mais importante é a pasta ciencia/bin. Nela você vê programas conhecidos: pip e python!

A pasta lib é onde são instaladas bibliotecas básicas e mais para frente as bibliotecas externas.

pjabardo@makhno:~/pasta$ ls ciencia/lib
python3.9
pjabardo@makhno:~/pasta$ ls ciencia/lib/python3.9/
site-packages
pjabardo@makhno:~/pasta$ ls ciencia/lib/python3.9/site-packages/
easy_install.py       pkg_resources-0.0.0.dist-info
pip                   __pycache__
pip-20.3.4.dist-info  setuptools
pkg_resources         setuptools-44.1.1.dist-info

Usando o ambiente virtual no Linux

Está tudo criado mas o ambiente não está ativado. Para isso é necessário usar os scripts ciencia/bin/activate (ou algo parecido). Qual o script você vai usar depende do ambiente que você está trabalhando. Nesse caso estou usando Linux com o shell bash (terminal). Então para ativar este ambiente executo o seguinte comando:

pjabardo@makhno:~/pasta$ source ciencia/bin/activate
(ciencia) pjabardo@makhno:~/pasta$ which python
/home/pjabardo/pasta/ciencia/bin/python
(ciencia) pjabardo@makhno:~/pasta$ which pip
/home/pjabardo/pasta/ciencia/bin/pip

Repare no (ciencia) antes do pjabardo@makhno. Isso mostra qual o nome do ambiente está sendo utlizado. No Linux, o comando which mostra qual o caminho (endereço) exato de um comando e pode-se ver claramente que o ambiente está ativo. Da mesma maneira, o comando pip se refere ao ambiente virtual.

Agora, quando executarmos o comando pip os pacotes serão instalados dentro deste ambiente virtual:

(ciencia) pjabardo@makhno:~/pasta$ pip install numpy
Collecting numpy
  Using cached numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.8 MB)
Installing collected packages: numpy
Successfully installed numpy-1.22.3
(ciencia) pjabardo@makhno:~/pasta$ ls ciencia/lib/python3.9/site-packages/
easy_install.py         pkg_resources
numpy                   pkg_resources-0.0.0.dist-info
numpy-1.22.3.dist-info  __pycache__
numpy.libs              setuptools
pip                     setuptools-44.1.1.dist-info
pip-20.3.4.dist-info

Olha que legal: o numpy foi instalado dentro deste ambiente separado. Neste ambiente virtual, pode-se instalar as versões mais recentes de pacotes ou versões de pacotes específicas (ver a documentação do pip).

Ambientes virtuais no Windows

As coisas aqui são quase iguais. A única diferença é que para se ativar o ambiente virtual é necessário executar um arquivo .bat: ciencia\bin\activate.bat. De resto é tudo igual.

Desativando ambientes virtuais

No final do trabalho, você pode querer desativar estes ambientes virtuais. Fechando o terminal funciona bem. Mas você pode executar o script deactivate:

(ciencia) pjabardo@makhno:~/pasta$ deactivate 
pjabardo@makhno:~/pasta$ 

Sugestão de como trabalhar com Python

Quando se está começando a trabalhar com Python e se descobre a quantidade enorme de pacotes disponíveis para quase qualquer atividade, existe uma tentação de sair instalando de tudo com pip. Evite fazer isso pois pode haver incompatibilidades entre os diferentes pacotes. Se a incompatibilidade for grande, o pip nem vai deixar você instalar alguns pacotes. Este é o melhor cenário com tudo funcionando do jeito que deveria funcionar. No entanto é comum que existam incompatibilidades pequenas: é provável que ninguém nunca instalou os mesmos pacotes na mesma sequência que você!

Se você está usando Linux, o sistema operacional tem um gerenciador/instalador de software que provavelmente inclui a maioria dos pacotes Python relevantes. E a compatibilidade entre os pacotes foi bastante testada pelos desenvolvedores do sistema operacional. Instale por aí.

Outra possibilidade, tanto no Windows ou no Linux (ou MacOS), é usar a distribuição de Python Anaconda mencionado várias vezes ao longo do curso. Essa distribuição testa exaustivamente a compatibilidade entre pacotes e possui um gerenciador próprio: conda. Use e abuse disso.

Muitas vezes, você precisa usar o pip, seja porque o pacote não está disponível no Anaconda/sistema operacional ou você precisa da versão mais recente do pacote. A minha recomendação é usar um ambiente virtual.

Como regra geral, use pip sempre dentro de um ambiente virtual!

Comentários

Comments powered by Disqus