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.