|
- +++
- title = "Dépendances"
- weight = 4
- +++
-
- # Dépendances
-
- ## Un autre exemple
-
- Prenons une autre bibliothèque : `cli-ui`.
-
- Elle permet d'afficher du texte en couleur dans un terminal
-
- ```python
- import cli_ui
-
- cli_ui.info("Ceci est en", cli_ui.red, "rouge")
- ```
-
- Elle permet également d'afficher des tableaux en couleur :
-
- ```python
- headers=["prénom", "score"]
- data = [
- [(bold, "John"), (green, 10.0)],
- [(bold, "Jane"), (green, 5.0)],
- ]
- cli_ui.info_table(data, headers=headers)
- ```
-
- Pour ce faire, elle repose sur la bibliothèque `tabulate` vue précédemment. On dit que `cli-ui` *dépend* de `tabulate`.
-
- ## Déclaration des dépendances
-
- La déclaration de la dépendance de `cli-ui` vers `tabulate` s'effectue également dans le fichier `setup.py`:
-
- ```python
- setup(
- name="cli-ui",
- version="0.9.1",
- install_requires=[
- "tabulate",
- ...
- ],
- ...
- )
- ```
-
- ## pypi.org
-
- On comprend dès lors qu'il doit nécessairement exister un *annuaire* permettant de relier les noms de dépendances à leur code source.
-
- Cet annuaire, c'est le site [pypi.org](https://pypi.org/). Vous y trouverez les pages correspondant à [tabulate](https://pypi.org/project/tabulate/) et [cli-ui](https://pypi.org/project/python-cli-ui/).
-
- # pip
-
- `pip` est un outil qui vient par défaut avec Python3[^4]. Vous pouvez également l'installer grâce au script [get-pip.py](https://bootstrap.pypa.io/get-pip.py), en lançant `python3 get-pip.py --user`.
-
- Il est conseillé de *toujours* lancer `pip` avec `python3 -m pip`. De cette façon, vous êtes certains d'utiliser le module `pip` correspondant à votre binaire `python3`, et vous ne dépendez pas de ce qu'il y a dans votre `PATH`.
-
- `pip` est capable d'interroger le site `pypi.org` pour retrouver les dépendances, et également de lancer les différents scripts `setup.py`.
-
- Comme de nombreux outils, il s'utilise à l'aide de *commandes*. Voici comment installer `cli-ui` à l'aide de la commande 'install' de `pip`:
-
- ```bash
- $ python3 -m pip install cli-ui --user
- Collecting cli-ui
- ...
- Requirement already satisfied: unidecode in /usr/lib/python3.7/site-packages (from cli-ui) (1.0.23)
- Requirement already satisfied: colorama in /usr/lib/python3.7/site-packages (from cli-ui) (0.4.1)
- Requirement already satisfied: tabulate in /mnt/data/dmerej/src/python-tabulate (from cli-ui) (0.8.4)
- Installing collected packages: cli-ui
- Successfully installed cli-ui-0.9.1
- ```
-
- On constate ici quelques limitations de `pip`:
-
- * Il faut penser à utiliser `--user` (de la même façon que lorsqu'on lance `setup.py` à la main)
- * Si le paquet est déjà installé dans le système, pip ne saura pas le mettre à jour - il faudra passer par le gestionnaire de paquet de
- la distribution
-
- En revanche, `pip` contient de nombreuses fonctionnalités intéressantes:
-
- * Il est capable de désinstaller des bibliothèques (à condition toutefois qu'elles ne soient pas dans un répertoire système)
- * Il est aussi capable d'afficher la liste complète des bibliothèques Python accessibles par l'utilisateur courant avec `freeze`.
-
- Voici un extrait de la commande `python3 -m pip freeze` au moment de la rédaction de cet article sur ma machine:
-
- ```
- $ python3 -m pip freeze
- apipkg==1.5
- cli-ui==0.9.1
- gaupol==1.5
- tabulate==0.8.4
- ```
-
- On y retrouve les bibliothèques `cli-ui` et `tabulate`, bien sûr, mais aussi la bibliothèque `gaupol`, qui correspond au [programme d'édition de sous-titres](https://otsaloma.io/gaupol/) que j'ai installé à l'aide du gestionnaire de paquets de ma distribution. Précisons que les modules de la bibliothèque standard et ceux utilisés directement par pip sont omis de la liste.
-
- On constate également que chaque bibliothèque possède un *numéro de version*.
-
- ## Numéros de version
-
- Les numéros de version remplissent plusieurs rôles, mais l'un des principaux est de spécifier des changements incompatibles.
-
- Par exemple, pour `cli-ui`, la façon d'appeler la fonction `ask_choice` a changé entre les versions 0.7 et 0.8, comme le montre cet extrait du [changelog](https://tankerhq.github.io/python-cli-ui/changelog.html#v0-8-0):
-
- > the list of choices used by ask_choice is now a named keyword argument:
-
- ```python
- # Old (<= 0.7)
- ask_choice("select a fruit", ["apple", "banana"])
- # New (>= 0.8)
- ask_choice("select a fruit", choices=["apple", "banana"])
- ```
-
- Ceci s'appelle un *changement d'API*.
-
- ## Réagir aux changements d'API
-
- Plusieurs possibilités:
-
- * On peut bien sûr adapter le code pour utiliser la nouvelle API, mais cela n'est pas toujours possible ni souhaitable.
- * Une autre solution est de spécifier des *contraintes* sur le numéro de version dans la déclaration des dépendances. Par exemple :
-
- ```python
- setup(
- install_requires=[
- "cli-ui < 0.8",
- ...
- ]
- )
- ```
-
- # Aparté : pourquoi éviter sudo pip
-
- Souvenez-vous que les fichiers systèmes sont contrôlés par votre gestionnaire de paquets.
-
- Les mainteneurs de votre distribution font en sorte qu'ils fonctionnent bien les uns
- avec les autres. Par exemple, le paquet `python3-cli-ui` ne sera mis à jour que lorsque tous les paquets qui en dépendent seront prêts à utiliser la nouvelle API.
-
- En revanche, si vous lancez `sudo pip` (où `pip` avec un compte root), vous allez écrire dans ces mêmes répertoire et vous risquez de "casser" certains programmes de votre système.
-
- Mais il y a un autre problème encore pire.
-
- # Conflit de dépendances
-
- Supposons deux projets A et B dans votre répertoire personnel. Ils dépendent tous les deux de `cli-ui`, mais l'un des deux utilise `cli-ui 0.7` et l'autre `cli-ui 0.9`. Que faire ?
|