Nella lezione sui moduli abbiamo accennato brevemente alla possibilità di installare moduli e package aggiuntivi che non fanno parte della libreria standard. In questa appendice, vedremo come usare il package manager pip per installare moduli e package dal Python Package Index.
Il Python Package Index e pip
Il Python Package Index (PyPI) è un repository che contiene decine di migliaia di package scritti in Python. Chiunque può scaricare package esistenti o condividere nuovi package su PyPI. PyPI è anche conosciuto con il nome di Cheese Shop, dallo sketch del cheese shop di Monty Python.
È possibile accedere ai package del Python Package Index sia tramite un browser (all'indirizzo https://pypi.org/), sia tramite un tool chiamato pip.
pip è un tool che ci permette di cercare, scaricare ed installare package Python che si trovano sul Python Package Index. Il nome è un acronimo ricorsivo, che significa Pip Installs Packages. pip ci consente inoltre di gestire i package che abbiamo già scaricato, permettendonci di aggiornarli o rimuoverli.
Installare pip
pip è già incluso nelle versioni di Python >= 3.4 e >= 2.7.9. Per verificare se questo tool è già installato, possiamo eseguire il comando python3 -m pip -V
o semplicemente pip3 -V
dal terminale. Se pip è già installato, questo comando ci mostrerà la versione installata.
Se, invece, non abbiamo installato pip, possiamo rimediare semplicemente scaricando ed eseguendo con Python lo script get-pip.py.
Aggiornare pip
È anche consigliato verificare che la versione di pip sia sempre aggiornata. Per aggiornarlo, possiamo usare il comando python3 -m pip install -U pip
, o più semplicemente pip install -U pip
.
Usare pip
pip supporta una serie di comandi che ci permettono, tra le altre cose, di cercare, scaricare, installare, aggiornare e rimuovere package. Vediamo in dettaglio il funzionamento dei comandi più comuni.
Cercare package
Per cercare package nel Python Package Index, possiamo usare il comando python3 -m pip search KEYWORD
. Ad esempio, se volessimo cercare il package BeautifulSoup
, possiamo eseguire il comando seguente, osservando il relativo output:
$ python3 -m pip search beautifulsoup
beautifulscraper (1.1.0)
- Python web-scraping library that wraps urllib2 and BeautifulSoup.
scrapy-beautifulsoup (0.0.2)
- Simple Scrapy middleware to process non-well-formed HTML with BeautifulSoup
ipython-beautifulsoup (0.3)
- Custom rendering of beautifulsoup objects in IPython notebook and qtconsole
django-beautifulsoup-test (1.1.3)
- TestCase class for using BeautifulSoup with Django tests
BeautifulSoup (3.2.1)
- HTML/XML parser for quick-turnaround applications like screen-scraping.
beautifulsoup4-slurp (0.0.2)
- Slurp packages Beautifulsoup4 into command line.
beautifulsoup4 (4.6.0)
- Screen-scraping library
INSTALLED: 4.6.0 (latest)
beautifulsoupselect (0.2)
- Simple wrapper to integrate BeautifulSoup and soupselect.py in a single package
collective.soupstrainer (2.0)
- Clean up HTML using BeautifulSoup and filter rules.
Detextile (0.0.3)
- Convert HTML to Textile syntax using BeautifulSoup.
spider-egg (0.1.0)
- a template for python crawler with requests and beautifulsoup
ElementSoup (rev452)
- ElementTree wrapper for BeautifulSoup HTML parser
...
Si noti che, oltre ai risultati della ricerca, l'ouput ci indica anche quali package sono installati e se ne esiste una versione più recente. In questo caso l'ultima versione di beautifulsoup
è già installata.
Installare package
Per installare un package, basta eseguire python3 -m pip install PACKAGE
. Ad esempio, se volessimo installare il package requests
, possiamo eseguire:
$ python3 -m pip install requests
Collecting requests
Downloading requests-2.18.4-py2.py3-none-any.whl (88kB)
100% |████████████████████████████████| 92kB 1.3MB/s
Collecting urllib3<1.23,>=1.21.1 (from requests)
Downloading urllib3-1.22-py2.py3-none-any.whl (132kB)
100% |████████████████████████████████| 133kB 2.4MB/s
Collecting certifi>=2017.4.17 (from requests)
Downloading certifi-2017.7.27.1-py2.py3-none-any.whl (349kB)
100% |████████████████████████████████| 358kB 869kB/s
Collecting idna<2.7,>=2.5 (from requests)
Downloading idna-2.6-py2.py3-none-any.whl (56kB)
100% |████████████████████████████████| 61kB 3.7MB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests)
Using cached chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: urllib3, certifi, idna, chardet,
requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6
requests-2.18.4 urllib3-1.22
Come possiamo vedere, pip non solo scarica e installa automaticamente il package, ma si assicura che tutte le dipendenze richieste dal package siano soddisfatte.
Se specifichiamo solo il nome del package, pip installerà automaticamente la versione più recente di esso. Se invece vogliamo installare una versione specifica, possiamo usare il comando python3 -m pip install 'package==X.Y.Z'
. Ad esempio, il seguente comando installerà requests
versione 2.16.5:
$ python3 -m pip install 'requests==2.16.5'
Collecting requests==2.16.5
Downloading requests-2.16.5-py2.py3-none-any.whl (87kB)
100% |████████████████████████████████| 92kB 911kB/s
Collecting urllib3<1.22,>=1.21.1 (from requests==2.16.5)
Downloading urllib3-1.21.1-py2.py3-none-any.whl (131kB)
100% |████████████████████████████████| 133kB 1.4MB/s
Collecting idna<2.6,>=2.5 (from requests==2.16.5)
Downloading idna-2.5-py2.py3-none-any.whl (55kB)
100% |████████████████████████████████| 61kB 2.9MB/s
Collecting certifi>=2017.4.17 (from requests==2.16.5)
Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests==2.16.5)
Using cached chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: urllib3, idna, certifi, chardet,
requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6
requests-2.16.5 urllib3-1.22
È inoltre possibile usare gli operatori <
, <=
, >
, >=
per specificare versioni massime e minime. Queste espressioni si possono anche combinare usando la virgola (,
), permettendoci di specificare sia una versione minima che una massima. Ad esempio, il seguente comando installerà la versione più recente di requests
2.16.x, ma non installerà la versione 2.17 o successive, anche se sono disponibili:
$ python3 -m pip install 'requests>=2.16,<2.17'
Collecting requests<2.17,>=2.16
Using cached requests-2.16.5-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests<2.17,>=2.16)
Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting urllib3<1.22,>=1.21.1 (from requests<2.17,>=2.16)
Using cached urllib3-1.21.1-py2.py3-none-any.whl
Collecting idna<2.6,>=2.5 (from requests<2.17,>=2.16)
Using cached idna-2.5-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests<2.17,>=2.16)
Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
Installing collected packages: chardet, urllib3, idna, certifi,
requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6
requests-2.16.5 urllib3-1.22
Come possiamo vedere dall'output, pip ha installato la versione 2.16.5, cioè la versione più recente di requests
2.16.x.
Nel caso di applicazioni complesse che hanno diverse dipendenze, non è necessario installare manualmente tutti i package necessari a uno a uno. pip ci dà la possibilità di elencare le dipendenze in un file requirements.txt, e di eseguire il comando python3 -m pip install -r requirements.txt
per installarle tutte simultaneamente.
Esistono infine diverse opzioni aggiuntive, che ci permettono anche di installare da repository diversi dal PyPI o direttamente da version control system. La descrizione di questa e altre opzioni avanzate può essere visualizzata eseguendo il comando python3 -m pip install --help
(o python3 -m pip install -h
).
Aggiornare package
Per aggiornare un package possiamo usare il comando install
in combinazione con l'opzione -U
o --upgrade
. Ad esempio, per aggiornare il package requests
alla versione più recente, possiamo usare:
$ python3 -m pip install -U requests
Collecting requests
Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests)
Using cached idna-2.6-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests)
Using cached urllib3-1.22-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
Installing collected packages: idna, chardet, urllib3, certifi,
requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6
requests-2.18.4 urllib3-1.22
Elencare package
Per vedere una lista di package installati, possiamo utilizzare il comando python3 -m pip list
:
$ python3 -m pip list
apt-xapian-index (0.47)
apturl (0.5.2)
asn1crypto (0.22.0)
beautifulsoup4 (4.6.0)
certifi (2017.7.27.1)
chardet (3.0.4)
command-not-found (0.3)
cryptography (1.9)
cupshelpers (1.0)
distro-info (0.17)
html5lib (0.999999999)
httplib2 (0.9.2)
...
Aggiungendo l'opzione --outdated
possiamo ottenere una lista di package che non sono correntemente aggiornati all'ultima versione.
È anche possibile visualizzare informazioni specifiche per un singolo package, usando il comando python3 -m pip show PACKAGE
. Ad esempio, per vedere le informazioni sul package requests
, possiamo eseguire:
$ python3 -m pip show requests
Name: requests
Version: 2.18.4
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: .../lib/python3.6/site-packages
Requires: urllib3, certifi, chardet, idna
Disinstallare package
Per rimuovere un package che abbiamo installato in precedenza, basta eseguire python3 -m pip uninstall PACKAGE
. Ad esempio, se volessimo rimuovere il package requests
, possiamo eseguire:
$ python3 -m pip uninstall requests
Uninstalling requests-2.18.4:
.../lib/python3.6/site-packages/requests-2.18.4.dist-info/DESCRIPTION.rst
.../lib/python3.6/site-packages/requests-2.18.4.dist-info/INSTALLER
.../lib/python3.6/site-packages/requests-2.18.4.dist-info/METADATA
.../lib/python3.6/site-packages/requests-2.18.4.dist-info/RECORD
.../lib/python3.6/site-packages/requests-2.18.4.dist-info/WHEEL
.../lib/python3.6/site-packages/requests-2.18.4.dist-info/metadata.json
.../lib/python3.6/site-packages/requests-2.18.4.dist-info/top_level.txt
.../lib/python3.6/site-packages/requests/__init__.py
...
Proceed (y/n)? y
Successfully uninstalled requests-2.18.4
Così come per il comando install
, il comando uninstall
ci permette di specificare un elenco di package da disinstallare mediante l'uso di un file requirements.txt
e del comando python3 -m pip uninstall -r requirements.txt
.
Controllare package
Infine, il comando python3 -m pip check
ci permette di verificare se tutte le dipendeze dei package correntemente installati siano state soddisfatte o meno:
$ python3 -m pip check
No broken requirements found.
pip include altri comandi e opzioni, che possono essere esplorati usando i comandi python3 -m pip --help
e python3 -m pip COMMAND --help
. È anche possibile consultare online la documentazione ufficiale di pip.