Pacotes e ambientes virtuais com pip e venv

Objetivos

  • Dar visão geral sobre gerenciadores de pacote e ambientes virtuais;

  • Aprender a utilizar o pip e o venv para gerenciar a instalação de pacotes, dependências e ambientes;

  • Compreender comandos do pip e do venv, e praticá-los em terminal

Ambientes virtuais

Ambientes virtuais são locais isolados do resto do sistema operacional (daí o nome “virtual”) onde podemos instalar pacotes sem que estes interfiram nos demais pacotes configurados globalmente.

Vantagens

Algumas vantagens de se trabalhar com ambientes virtuais são:

  • Impedir conflitos de versão: suponha que o projeto A no qual você trabalha dependa de uma biblioteca que está na versão X. Então, dentro de alguns meses, você inicia um outro projeto B que depende de uma versão mais nova que X da mesma biblioteca e a atualiza. O projeto B funciona maravilhosamente bem, mas o A para de funcionar porque não suporta outra versão além da X. Conclusão: um conflito de versões!

  • Facilidade para reproduzir e instalar: uma vez que você tiver controle sobre as versões exatas necessárias para que seu projeto funcione, torna-se fácil para outros usuários reproduzir o projeto construindo-o e instalando o que for necessário.

  • Execução independente de acesso privilegiado: com um ambiente virtual, um usuário que se encontra em uma rede na qual ele não tem acesso como administrador para instalar programas livremente, é possível executar projetos sem ter acesso em nível de root.

Gerenciamento de pacotes e ambientes

Em geral, instalamos “pacotes” em ambientes virtuais. Pacotes podem ser comparados à concessão de habilidades e especializações a um programa. Logo, é necessário que compreendamos como gerimos a instalação de pacotes antes de criarmos ambientes virtuais. Aqui, falaremos um pouco sobre o pip e o venv.

pip

A comunidade Python disponibiliza uma infinidade de pacotes em um local remoto chamado PyPi, que significa Python Package Index. Uma das maneiras mais fáceis de instalar pacotes Python de terceiros disponíveis na PyPi é usar o gerenciador de pacotes chamado pip.

Hint

Está precisando de uma especialidade para seu programa? Confira se o que você precisa já não existe na PyPi. Não reinvente a roda!

  • Verificar instalação

# no sistema operacional, remover o !
!pip --version 
pip 21.1.1 from /Users/gustavo/opt/anaconda3/lib/python3.8/site-packages/pip (python 3.8)
  • Verificar lista de pacotes instalados

!pip list
Package                            Version
---------------------------------- -------------------
alabaster                          0.7.12
anaconda-client                    1.7.2
anaconda-navigator                 2.0.3
anaconda-project                   0.10.0
anyio                              3.0.1
appdirs                            1.4.4
applaunchservices                  0.2.1
appnope                            0.1.2
appscript                          1.1.2
argh                               0.26.2
argon2-cffi                        20.1.0
arrow                              0.13.1
asn1crypto                         1.4.0
astroid                            2.5
astropy                            4.2.1
async-generator                    1.10
atomicwrites                       1.4.0
attrs                              21.2.0
autopep8                           1.5.6
Babel                              2.9.1
backcall                           0.2.0
backports.functools-lru-cache      1.6.4
backports.shutil-get-terminal-size 1.0.0
backports.tempfile                 1.0
backports.weakref                  1.0.post1
beautifulsoup4                     4.9.3
binaryornot                        0.4.4
bitarray                           2.1.0
bkcharts                           0.2
black                              19.10b0
bleach                             3.3.0
bokeh                              2.3.2
boto                               2.49.0
Bottleneck                         1.3.2
brotlipy                           0.7.0
certifi                            2020.12.5
cffi                               1.14.5
chardet                            4.0.0
click                              8.0.1
cloudpickle                        1.6.0
clyent                             1.2.2
colorama                           0.4.4
conda                              4.10.1
conda-build                        3.21.4
conda-content-trust                0+unknown
conda-pack                         0.6.0
conda-package-handling             1.7.3
conda-repo-cli                     1.0.4
conda-token                        0.3.0
conda-verify                       3.4.2
contextlib2                        0.6.0.post1
cookiecutter                       1.7.2
cryptography                       3.4.7
cycler                             0.10.0
Cython                             0.29.23
cytoolz                            0.11.0
dask                               2021.4.0
decorator                          5.0.9
defusedxml                         0.7.1
diff-match-patch                   20200713
distributed                        2021.5.0
docutils                           0.17.1
entrypoints                        0.3
et-xmlfile                         1.1.0
fastcache                          1.1.0
filelock                           3.0.12
flake8                             3.9.0
Flask                              1.1.2
fsspec                             0.9.0
future                             0.18.2
gevent                             21.1.2
ghp-import                         1.1.0
gitdb                              4.0.7
GitPython                          3.1.14
glob2                              0.7
gmpy2                              2.0.8
gmsh                               4.8.4
greenlet                           1.1.0
h5py                               2.10.0
HeapDict                           1.0.1
html5lib                           1.1
idna                               2.10
imageio                            2.9.0
imagesize                          1.2.0
importlib-metadata                 3.10.0
inflection                         0.5.1
iniconfig                          1.1.1
intervaltree                       3.1.0
ipykernel                          5.3.4
ipython                            7.22.0
ipython-genutils                   0.2.0
ipywidgets                         7.6.3
isort                              5.8.0
itsdangerous                       2.0.1
jdcal                              1.4.1
jedi                               0.17.2
Jinja2                             2.11.3
jinja2-time                        0.2.0
joblib                             1.0.1
json5                              0.9.5
jsonschema                         3.2.0
jupyter                            1.0.0
jupyter-book                       0.10.2
jupyter-cache                      0.4.2
jupyter-client                     6.1.12
jupyter-console                    6.4.0
jupyter-core                       4.7.1
jupyter-packaging                  0.7.12
jupyter-server                     1.7.0
jupyter-server-mathjax             0.2.2
jupyter-sphinx                     0.3.2
jupyterbook-latex                  0.2.0
jupyterlab                         3.0.14
jupyterlab-pygments                0.1.2
jupyterlab-server                  2.4.0
jupyterlab-widgets                 1.0.0
jupytext                           1.10.3
keyring                            23.0.1
kiwisolver                         1.3.1
latexcodec                         2.0.1
lazy-object-proxy                  1.6.0
libarchive-c                       2.9
linkify-it-py                      1.0.1
llvmlite                           0.36.0
locket                             0.2.1
lxml                               4.6.3
markdown-it-py                     0.6.2
MarkupSafe                         1.1.1
matplotlib                         3.3.4
mccabe                             0.6.1
mdit-py-plugins                    0.2.8
meshio                             4.4.3
mistune                            0.8.4
mkl-fft                            1.3.0
mkl-random                         1.2.1
mkl-service                        2.3.0
mock                               4.0.3
more-itertools                     8.7.0
mpmath                             1.2.1
msgpack                            1.0.2
multipledispatch                   0.6.0
mypy-extensions                    0.4.3
myst-nb                            0.12.3
myst-parser                        0.13.7
navigator-updater                  0.2.1
nbclassic                          0.2.6
nbclient                           0.5.3
nbconvert                          6.0.7
nbdime                             3.0.0
nbformat                           5.1.3
nest-asyncio                       1.5.1
nested-lookup                      0.2.22
networkx                           2.5
nltk                               3.6.2
nose                               1.3.7
notebook                           6.4.0
numba                              0.53.1
numexpr                            2.7.3
numpy                              1.20.2
numpydoc                           1.1.0
olefile                            0.46
openpyxl                           3.0.7
packaging                          20.9
pandas                             1.2.4
pandocfilters                      1.4.3
parso                              0.7.0
partd                              1.2.0
path                               15.1.2
pathlib2                           2.3.5
pathspec                           0.7.0
pathtools                          0.1.2
patsy                              0.5.1
pep8                               1.7.1
pexpect                            4.8.0
pickleshare                        0.7.5
Pillow                             8.2.0
pip                                21.1.1
pkginfo                            1.7.0
pluggy                             0.13.1
ply                                3.11
poyo                               0.5.0
prometheus-client                  0.10.1
prompt-toolkit                     3.0.17
psutil                             5.8.0
ptyprocess                         0.7.0
py                                 1.10.0
pybtex                             0.24.0
pybtex-docutils                    1.0.0
pycodestyle                        2.6.0
pycosat                            0.6.3
pycparser                          2.20
pycurl                             7.43.0.6
pydata-sphinx-theme                0.6.3
pydocstyle                         6.1.1
pyerfa                             2.0.0
pyflakes                           2.2.0
Pygments                           2.9.0
pygmsh                             7.1.9
pylint                             2.7.4
pyls-black                         0.4.6
pyls-spyder                        0.3.2
pyodbc                             4.0.0-unsupported
pyOpenSSL                          20.0.1
pyparsing                          2.4.7
pyrsistent                         0.17.3
PySocks                            1.7.1
pytest                             6.2.3
python-dateutil                    2.8.1
python-jsonrpc-server              0.4.0
python-language-server             0.36.2
python-slugify                     5.0.2
pytz                               2021.1
PyWavelets                         1.1.1
PyYAML                             5.4.1
pyzmq                              20.0.0
QDarkStyle                         3.0.2
qstylizer                          0.1.10
QtAwesome                          1.0.2
qtconsole                          5.0.3
QtPy                               1.9.0
regex                              2021.4.4
requests                           2.25.1
rope                               0.18.0
Rtree                              0.9.7
ruamel-yaml-conda                  0.15.100
scikit-image                       0.16.2
scikit-learn                       0.24.2
scipy                              1.6.2
seaborn                            0.11.1
Send2Trash                         1.5.0
setuptools                         52.0.0.post20210125
simplegeneric                      0.8.1
singledispatch                     0.0.0
six                                1.15.0
smmap                              4.0.0
sniffio                            1.2.0
snowballstemmer                    2.1.0
sortedcollections                  2.1.0
sortedcontainers                   2.3.0
soupsieve                          2.2.1
Sphinx                             4.0.1
sphinx-book-theme                  0.1.0
sphinx-comments                    0.0.3
sphinx-copybutton                  0.3.1
sphinx-panels                      0.5.2
sphinx-thebe                       0.0.8
sphinx-togglebutton                0.2.3
sphinxcontrib-applehelp            1.0.2
sphinxcontrib-bibtex               2.1.4
sphinxcontrib-devhelp              1.0.2
sphinxcontrib-htmlhelp             1.0.3
sphinxcontrib-jsmath               1.0.1
sphinxcontrib-qthelp               1.0.3
sphinxcontrib-serializinghtml      1.1.4
sphinxcontrib-websupport           1.2.4
spyder                             5.0.0
spyder-kernels                     2.0.1
SQLAlchemy                         1.4.15
statsmodels                        0.12.2
sympy                              1.8
tables                             3.6.1
tblib                              1.7.0
terminado                          0.9.4
testpath                           0.4.4
text-unidecode                     1.3
textdistance                       4.2.1
threadpoolctl                      2.1.0
three-merge                        0.1.1
tinycss                            0.4
toml                               0.10.2
toolz                              0.11.1
tornado                            6.1
tqdm                               4.59.0
traitlets                          5.0.5
typed-ast                          1.4.2
typing-extensions                  3.7.4.3
uc-micro-py                        1.0.1
ujson                              4.0.2
unicodecsv                         0.14.1
Unidecode                          1.2.0
urllib3                            1.26.4
watchdog                           1.0.2
wcwidth                            0.2.5
webencodings                       0.5.1
websocket-client                   0.59.0
Werkzeug                           1.0.1
wheel                              0.36.2
whichcraft                         0.6.1
widgetsnbextension                 3.5.1
wrapt                              1.12.1
wurlitzer                          2.1.0
xlrd                               2.0.1
XlsxWriter                         1.3.8
xlwings                            0.23.0
xlwt                               1.3.0
xmltodict                          0.12.0
yapf                               0.31.0
zict                               2.0.0
zipp                               3.4.1
zope.event                         4.5.0
zope.interface                     5.3.0
  • Imprimir informações sobre um pacote listado

!pip show alabaster
Name: alabaster
Version: 0.7.12
Summary: A configurable sidebar-enabled Sphinx theme
Home-page: https://alabaster.readthedocs.io
Author: Jeff Forcier
Author-email: jeff@bitprophet.org
License: UNKNOWN
Location: /Users/gustavo/opt/anaconda3/lib/python3.8/site-packages
Requires: 
Required-by: Sphinx
  • Para atualizar o pip para uma versão mais nova

python -m pip install --upgrade pip
  • Para ajuda do pip

pip -h

Comandos de interesse são install, uninstall, e search. Entretanto, quando fazemos algo como

pip install lxml

para instalar a biblioteca lxml, por exemplo, o pip a instalará globalmente em seu computador. Todavia, isso pode ser uma má escolha se você trabalhar com múltiplos projetos e versões como explicado anteriormente. Para evitar potenciais conflitos de versão e imcompatibilidades, podemos criar ambientes virtuais com o venv.

venv

O módulo venv passou a ser integrado na versão Python 3.3 e é intensamente discutido no PEP 405. Ele surgiu como uma melhoria do módulo anterior virtualenv, criado para Python 2, e com uma promessa de confiabilidade superior de isolamento. Por padrão, ele já vem instalado.

Nesta seção, abordaremos as etapas essenciais do trabalho com venv, que deverão ser realizadas através da linha de comando, a saber:

  • Criação e configuração do ambiente virtual

  • Instalação e gestão de pacotes no ambiente virtual

  • Salvamento e replicação do ambiente virtual

Criação e configuração do ambiente virtual

Vamos supor que o nosso ambiente virtual seja chamado de icd. Para criá-lo, fazemos o seguinte:

!python3 -m venv icd

Um diretório icd é criado no diretório a partir do qual o comando foi executado contendo outros diretórios.

!ls -l icd
total 8
drwxr-xr-x@ 13 gustavo  staff  416 Jul  7 22:54 bin
drwxr-xr-x@  2 gustavo  staff   64 Jul  7 22:54 include
drwxr-xr-x@  3 gustavo  staff   96 Jul  7 22:54 lib
-rw-r--r--@  1 gustavo  staff  104 Jul  7 22:54 pyvenv.cfg

A estrutura mostra que:

  • lib: é um diretório de pacotes independentes

  • bin: é um diretório com as ferramentas de inicialização e interrupção do ambiente

Para ativar o ambiente, fazemos:

A ativação do ambiente produzirá uma mudança no terminal, tal como:

Instalação e gestão de pacotes no ambiente virtual

Uma vez ativado o ambiente, você está isolado do sistema global para instalar pacotes. Vamos agora realizar a instalação dos seguintes pacotes, úteis para o nosso curso:

  • numpy

  • scipy

  • sympy

  • matplotlib

  • pandas

  • seaborn

Antes de prosseguir, vamos verificar o que há no ambiente.

Como vemos, há apenas dois pacotes no ambiente. Agora, podemos proceder à instalação dos pacotes requisitados.

Warning

Se necessário, atualize o pip com pip install --upgrade pip.

Para verificar se todos os pacotes foram instalados, fazemos:

Como podemos ver, não apenas os pacotes requisitados são instalados, mas também uma série de pacotes dependentes adicionais, tais como mpmath e six.

Salvamento e replicação do ambiente virtual

Depois de termos estabelecido um ambiente virtual complexo, se houver interesse em mantê-lo para uso futuro, é natural que “salvemos” o seu estado para que possamos replicá-lo em outro lugar, ou permitir que outro usuário aproveite nossa configuração para construir o ambiente.

Há uma maneira muito interessante de fazer isto, que se resume em usar o comando freeze e redirecionar os pacotes do ambiente para um arquivo de requisitos que chamaremos de requirements.txt.

Se analisarmos o conteúdo do arquivo requirements.txt, veremos algo como:

A replicação do nosso ambiente icd em outro computador, por exemplo, pode então ser feita da seguinte forma:

Se quisermos desinstalar todos os pacotes de uma só vez, podemos fazer algo como:

Uma vez desinstalados, se listarmos novamente os pacotes no ambiente, veríamos exatamente o que tínhamos no início:

O arquivo de requisitos permite-nos realizar mais algumas coisas de maneira eficiente:

  • Se alterarmos o símbolo de = para >= em algum pacote, indicaremos uma restrição para versões dos pacotes, mas ampliaremos a possibilidade. Por exemplo, numpy>=1.14.1 indicar que qualquer versão igual ou acima de 1.14.1 seria possível para o numpy.

  • Se aplicarmos um comando como pip install --upgrade -r requirements.txt, forçaremos um upgrade total de uma só vez para todos os pacotes do ambiente.

Finalmente, para excluir o ambiente, basta desativá-lo e posteriormente deletar o seu conteúdo.

Outras opções

Há várias formas disponíveis hoje em dia para alcançar a “separação” virtual de ambientes. Algumas opções que você pode estudar mais a respeito são:

  • Contêinerização com Docker ou Kubernetes

  • Máquinas virtuais (virtual machines)

  • Gerenciamento de ambientes com conda, miniconda, pipenv,

Veremos mais à frente como gerenciar pacotes e ambientes com um rápido curso sobre conda.

Referências