Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
Repozitorijs ir arhivēts. Tam var aplūkot failus un to var klonēt, bet nevar iesūtīt jaunas izmaiņas, kā arī atvērt jaunas problēmas/izmaiņu pieprasījumus.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. Dépendances
  2. ===========
  3. Prenons une autre bibliothèque : ``cli-ui``.
  4. Elle permet d'afficher du texte en couleur dans un terminal::
  5. import cli_ui
  6. cli_ui.info("Ceci est en", cli_ui.red, "rouge")
  7. Elle permet également d'afficher des tableaux en couleur::
  8. headers=["name", "score"]
  9. data = [
  10. [(bold, "John"), (green, 10.0)],
  11. [(bold, "Jane"), (green, 5.0)],
  12. ]
  13. cli_ui.info_table(data, headers=headers)
  14. Pour ce faire, elle repose sur la bibliothèque ``tabulate`` vue
  15. précédemment. On dit que ``cli-ui`` *dépend* de ``tabulate``.
  16. Déclaration des dépendances
  17. ----------------------------
  18. La déclaration de la dépendance de ``cli-ui`` vers ``tabulate`` s'effectue également dans le fichier ``setup.py``::
  19. setup(
  20. name="cli-ui",
  21. version="0.9.1",
  22. install_requires=[
  23. "tabulate",
  24. ...
  25. ],
  26. ...
  27. )
  28. pypi.org
  29. ---------
  30. On comprend dès lors qu'il doit nécessairement exister un *annuaire* permettant de relier les noms de dépendances à leur code source.
  31. Cet annuaire, c'est le site `pypi.org <https://pypi.org/>`_. Vous y trouverez
  32. les pages correspondant à `tabulate <https://pypi.org/project/tabulate/>`_
  33. et `cli-ui <https://pypi.org/project/python-cli-ui/>`_.
  34. pip
  35. ---
  36. ``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``.
  37. Il est conseillé de *toujours* lancer ``pip`` avec ``python3 -m pip``. De cette
  38. façon, vous êtes certains d'utiliser le module ``pip`` correspondant à votre
  39. binaire ``python3``, et vous ne dépendez pas de ce qu'il y a dans votre ``PATH``.
  40. ``pip`` est capable d'interroger le site ``pypi.org`` pour retrouver les
  41. dépendances, et également de lancer les différents scripts ``setup.py``.
  42. Comme de nombreux outils, il s'utilise à l'aide de *commandes*. Voici
  43. comment installer ``cli-ui`` à l'aide de la commande 'install' de ``pip``:
  44. .. code-block:: console
  45. $ python3 -m pip install cli-ui --user
  46. Collecting cli-ui
  47. ...
  48. Requirement already satisfied: unidecode in /usr/lib/python3.7/site-packages (from cli-ui) (1.0.23)
  49. Requirement already satisfied: colorama in /usr/lib/python3.7/site-packages (from cli-ui) (0.4.1)
  50. Requirement already satisfied: tabulate in /mnt/data/dmerej/src/python-tabulate (from cli-ui) (0.8.4)
  51. Installing collected packages: cli-ui
  52. Successfully installed cli-ui-0.9.1
  53. On constate ici quelques limitations de ``pip``:
  54. * Il faut penser à utiliser ``--user`` (de la même façon que lorsqu'on lance ``setup.py`` à la main)
  55. * Si le paquet est déjà installé dans le système, pip ne saura pas le
  56. mettre à jour - il faudra passer par le gestionnaire de paquet de
  57. la distribution
  58. En revanche, `pip` contient de nombreuses fonctionnalités intéressantes:
  59. * Il est capable de désinstaller des bibliothèques (à condition toutefois
  60. qu'elles ne soient pas dans un répertoire système)
  61. * Il est aussi capable d'afficher la liste complète des bibliothèques
  62. Python accessibles par l'utilisateur courant avec `freeze`.
  63. Voici un extrait de la commande ``python3 -m pip freeze`` au moment de la rédaction de cet article sur ma machine:
  64. .. code-block:: console
  65. $ python3 -m pip freeze
  66. apipkg==1.5
  67. cli-ui==0.9.1
  68. gaupol==1.5
  69. tabulate==0.8.4
  70. On y retrouve les bibliothèques ``cli-ui`` et ``tabulate``, bien sûr, mais
  71. aussi la bibliothèque ``gaupol``, qui correspond au [programme d'édition de
  72. sous-titres](https://otsaloma.io/gaupol/) que j'ai installé à l'aide du
  73. gestionnaire de paquets de ma distribution. Précisons que les modules de
  74. la bibliothèque standard et ceux utilisés directement par pip sont omis
  75. de la liste.
  76. On constate également que chaque bibliothèque possède un *numéro de version*.
  77. Numéros de version
  78. -------------------
  79. Les numéros de version remplissent plusieurs rôles, mais l'un des principaux
  80. est de spécifier des changements incompatibles.
  81. Par exemple, pour ``cli-ui``, la façon d'appeler la fonction ``ask_choice``
  82. a changé entre les versions 0.7 et 0.8, comme le montre cet extrait du
  83. `changelog <https://tankerhq.github.io/python-cli-ui/changelog.html#v0-8-0)>`_:
  84. *The list of choices used by ask_choice is now a named keyword argument:*
  85. .. code-block::
  86. # Old (<= 0.7)
  87. ask_choice("select a fruit", ["apple", "banana"])
  88. # New (>= 0.8)
  89. ask_choice("select a fruit", choices=["apple", "banana"])
  90. Ceci s'appelle un *changement d'API*.
  91. Réagir aux changements d'API
  92. -----------------------------
  93. Plusieurs possibilités:
  94. * On peut bien sûr adapter le code pour utiliser la nouvelle API, mais cela
  95. n'est pas toujours possible ni souhaitable.
  96. * Une autre solution est de spécifier des *contraintes* sur le numéro de
  97. version dans la déclaration des dépendances. Par exemple::
  98. setup(
  99. install_requires=[
  100. "cli-ui < 0.8",
  101. ...
  102. ]
  103. )
  104. Aparté : pourquoi éviter sudo pip
  105. ---------------------------------
  106. Souvenez-vous que les fichiers systèmes sont contrôlés par votre gestionnaire de paquets.
  107. Les mainteneurs de votre distribution font en sorte qu'ils fonctionnent bien les uns
  108. avec les autres. Par exemple, le paquet ``python3-cli-ui`` ne sera mis à jour
  109. que lorsque tous les paquets qui en dépendent seront prêts à utiliser la
  110. nouvelle API.
  111. En revanche, si vous lancez ``sudo pip`` (où ``pip`` avec un compte root),
  112. vous allez écrire dans ces mêmes répertoire et vous risquez de "casser"
  113. certains programmes de votre système.
  114. Mais il y a un autre problème encore pire.
  115. Conflit de dépendances
  116. ----------------------
  117. Supposons deux projets A et B dans votre répertoire personnel. Ils dépendent
  118. tous les deux de ``cli-ui``, mais l'un des deux utilise ``cli-ui 0.7`` et l'autre
  119. ``cli-ui 0.9``. Que faire ?