Pourquoi gérons-nous les versions des paquets ?
Lorsque vous avez travaillé sur des documents texte, vous avez probablement dû nommer certains d’entre eux comme ceci : myfile.doc
, myfilev2.doc
, myfilev3.doc
, pour savoir à quelle version ils correspondent. Vous avez peut-être également indiqué la date dans le nom du fichier : myfile22062020.doc
, myfile23062020.doc
, !myfile27062020.doc
.
Comme pour les documents texte, les paquets Python sont "versionnés" pour faciliter le suivi des versions de chacun. Les versions des paquets Python, toutefois, sont gérées selon un format strict :
major.minor.patch
... où major
, minor
et patch
sont tous des nombres entiers.
Chaque fois qu'un changement est apporté à un paquet Python, le numéro de version change (quelle que soit l'importance de la modification). Les modifications sont réparties en trois catégories différentes :
Si la modification consiste en une correction de bug rétrocompatible, le numéro de
patch
est incrémenté.Si elle consiste en un élément de nouvelle fonctionnalité rétrocompatible, le numéro
minor
est incrémenté.Si elle n'est pas rétrocompatible , alors
major
est incrémenté. Il s'agit alors d'un « breaking change » :pirate:, ce qui signifie que le changement de version peut “casser” un script Python donné, et il sera nécessaire de réécrire ce dernier en tenant compte des changements apparus dans la nouvelle version du paquet.
Dans ce cours, nous avons jusqu'à présent installé des paquets Python à l'aide de la commande pip install <package>
, où <package>
correspond au nom du paquet Python que vous voulez installer. Lorsque nous exécutons cette commande, la version du paquet n'est absolument pas mentionnée. Toutefois, vous pouvez remarquer que le résultat de la commande contient une référence à une version particulière du paquet. Par exemple, si j'exécute la commande suivante :
$ pip install requests Collecting requests Using cached https://files.pythonhosted.org/packages/45/1e/0c169c6a5381e241ba7404532c16a21d86ab872c9bed8bdcd4c423954103/requests-2.24.0-py2.py3-none-any.whl Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in ./anaconda3/lib/python3.7/site-packages (from requests) (1.24.1) Requirement already satisfied: certifi>=2017.4.17 in ./anaconda3/lib/python3.7/site-packages (from requests) (2019.6.16) Requirement already satisfied: chardet<4,>=3.0.2 in ./anaconda3/lib/python3.7/site-packages (from requests) (3.0.4) Requirement already satisfied: idna<3,>=2.5 in ./anaconda3/lib/python3.7/site-packages (from requests) (2.8) Installing collected packages: requests Successfully installed requests-2.24.0
Notez que ma commande pip install requests
ne mentionne pas de version spécifique du paquet, mais que la dernière ligne du résultat, Successfully installed requests-2.24.0
, montre que nous avons installé une version spécifique : 2.24.0
. Cette version est, à l'heure actuelle, la dernière version disponible du paquet requests
. Si vous ne spécifiez pas de version de paquet, pip
installe donc le dernier paquet requests
disponible.
Maîtrisez le système de versioning des paquets
Le moyen le plus simple pour installer une version de paquet Python consiste à utiliser l'opérateur ==
. Par exemple, pip install requests==2.1.0
installera, comme vous vous en doutez, la version 2.1.0
. Il existe toutefois plusieurs façons différentes de préciser la version du paquet. Par exemple :
pip install requests~=2.2
installera la version la plus élevée disponible au-dessus de2.2!
, mais pas3.0
ni les versions ultérieures.pip install requests~=2.1.0
installera la version la plus élevée disponible au-dessus de2.1.0
, mais pas la version2.2.0
ni les versions ultérieures.pip install requests>2.5.0
installera la version la plus élevée disponible au-dessus de2.5.0
.pip install "requests>2.4.0,<2.6.0"
installera la version la plus élevée disponible supérieure à2.4.0
, mais inférieure à2.6.0
.
Notez que dans le dernier exemple, puisque nous utilisons une syntaxe plus compliquée, nous encadrons le nom du paquet et nos exigences de versions avec des guillemets.
Testons ensemble quelques-unes de ces commandes. Chaque fois que nous installerons le paquet requests
, nous le désinstallerons à l'aide de la commande pip uninstall <package>
. Commençons par désinstaller requests
:
$ pip uninstall requests Uninstalling requests-2.5.3: Would remove: /Users/george/anaconda3/lib/python3.7/site-packages/requests-2.5.3.dist-info/* /Users/george/anaconda3/lib/python3.7/site-packages/requests/* Proceed (y/n)? y Successfully uninstalled requests-2.5.3
Exécutons maintenant pip install requests~=2.2
:
$ pip install requests~=2.2 Collecting requests~=2.2 Using cached https://files.pythonhosted.org/packages/45/1e/0c169c6a5381e241ba7404532 c16a21d86ab872c9bed8bdcd4c423954103/requests-2.24.0-py2.py3-none-any.whl Requirement already satisfied: idna<3,>=2.5 in ./anaconda3/lib/python3.7/site-packages (from requests~=2.2) (2.8) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in ./anaconda3/lib/python3.7/site-packages (from requests~=2.2) (1.24.1) Requirement already satisfied: certifi>=2017.4.17 in ./anaconda3/lib/python3.7/site-packages (from requests~=2.2) (2019.6.16) Requirement already satisfied: chardet<4,>=3.0.2 in ./anaconda3/lib/python3.7/site-packages (from requests~=2.2) (3.0.4) Installing collected packages: requests Successfully installed requests-2.24.0
Comme prévu, cette commande installe la version 2.24.0
, soit la version la plus élevée de requests
disponible en dessous de 3.0
(qui d’ailleurs n'existe pas encore à l'heure où sont écrites ces lignes).
Désinstallons à nouveau, puis exécutons pip install requests~=2.1.0
:
$ pip uninstall requests Uninstalling requests-2.24.0: Would remove: /Users/george/anaconda3/lib/python3.7/site-packages/requests-2.24.0.dist-info/* /Users/george/anaconda3/lib/python3.7/site-packages/requests/* Proceed (y/n)? y Successfully uninstalled requests-2.24.0 $ pip install requests~=2.1.0 Collecting requests~=2.1.0 Using cached https://files.pythonhosted.org/packages/1e/97/f0a8e5e71c75a2abf5ec91438b84ec1a40a5e1b5f985c06721a3ebe57c0a/requests-2.1.0-py2.py3-none-any.whlconda 4.7.5 has requirement requests>=2.12.4, but you'll have requests 2.1.0 which is incompatible. anaconda-client 1.7.2 has requirement requests>=2.9.1, but you'll have requests 2.1.0 which is incompatible. Installing collected packages: requests Successfully installed requests-2.1.0
Cette commande installe la version 2.1.0
, soit la version la plus élevée de requests
disponible dans la plage 2.1.x
.
Désinstallons à nouveau requests
et essayons notre dernière commande d'installation, pip install “requests>2.4.0,<2.6.0”
:
$ pip uninstall requests Uninstalling requests-2.1.0: Would remove: /Users/george/anaconda3/lib/python3.7/site-packages/requests-2.1.0.dist-info/* /Users/george/anaconda3/lib/python3.7/site-packages/requests/* Proceed (y/n)? y Successfully uninstalled requests-2.1.0 $ pip install “requests>2.4.0,<2.6.0” -bash: 2.6.0”: No such file or directory $ pip install "requests>2.4.0,<2.6.0" Collecting requests<2.6.0,>2.4.0 Using cached https://files.pythonhosted.org/packages/95/54/44dc83b5f11c6da06bf9abd18c8a0905e0e297e0a9c3bfbc0c6ee4bdd33d/requests-2.5.3-py2.py3-none-any.whlconda 4.7.5 has requirement requests>=2.12.4, but you'll have requests 2.5.3 which is incompatible. anaconda-client 1.7.2 has requirement requests>=2.9.1, but you'll have requests 2.5.3 which is incompatible. Installing collected packages: requests Successfully installed requests-2.5.3
Cette commande installe requests! !2.5.3
, la version de requests
la plus élevée disponible, supérieure à 2.4.0
mais inférieure à 2.6.0
.
Pour me voir installer différentes versions de requests
, regardez la vidéo suivante :
Exercice
Votre responsable a effectué des analyses à l'aide de Python. Il a écrit un script qui utilise deux paquets Python : matplotlib
version 3.2.2
et numpy
version 1.19.0
.
D’abord, installez le script : p1c4s2_script.py
Puis installez les deux versions spécifiques de paquets et exécutez le script.
En résumé
Les paquets Python sont versionnés pour faciliter le suivi des versions de chaque code.
Les paquets Python reçoivent un nouveau numéro de version chaque fois qu'une modification leur est apportée.
Vous pouvez utiliser
!pip!
pour installer la version souhaitée d'un paquet Python.
Maintenant que vous maîtrisez le système de versioning des paquets Python, vérifions que vous avez compris le pip à l'aide d'un quiz rapide. Nous verrons ensuite comment configurer un environnement virtuel, ce qui est l'une des façons d'utiliser des versions de paquets Python différentes pour des projets distincts.