You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

python-11.md 6.8 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. % Programmation avec Python (chapitre 11)
  2. % Dimitri Merejkowsky
  3. \center \huge Retour sur les exceptions
  4. # A quoi sert finally?
  5. ```python
  6. try:
  7. file = open("file.txt")
  8. 1 / 0
  9. except ZeroDivisionError:
  10. print("got you")
  11. finally:
  12. print("closing")
  13. file.close()
  14. ```
  15. # versus
  16. ```python
  17. try:
  18. file = open("file.txt")
  19. 1 / 0
  20. except ZeroDivisionError:
  21. print("got you")
  22. file.close()
  23. ```
  24. # Réponse:
  25. Que se passe-t-il si l'exception *n'est pas* ZeroDivisionError?
  26. #
  27. \center \huge Utiliser des bibliothèques tierces
  28. # Rappel
  29. ```python
  30. import foo
  31. foo.bar()
  32. ```
  33. Fonctionne si:
  34. * Il y a un `foo.py` quelque part qui contient une fonction `bar`
  35. * Dans le dossier courant
  36. * Ou dans la bibliothèque standard Python
  37. # Parlons de PATH
  38. * Vous connaissez peut-être la variable d'environement PATH, qui dit
  39. où sont les exécutables.
  40. ```bash
  41. PATH="/bin:/usr/bin:/usr/sbin"
  42. $ ifconfig
  43. # résout sur /usr/sbin/ifconfig
  44. $ ls
  45. # résout sur /bin/ls
  46. ```
  47. Résoudre: trouver le premier élément dans la liste.
  48. # sys.path
  49. En Python c'est pareil.
  50. ```python
  51. import sys
  52. print(sys.path)
  53. ```
  54. # Sur mon Arch
  55. ```
  56. * '' # vide = chemin courant
  57. * /usr/lib/python3.7
  58. * /usr/lib/python3.7/lib-dynload
  59. * /home/dmerej/.local/lib/python3.7/site-packages
  60. * /usr/lib/python3.7/site-packages
  61. ```
  62. * Le chemin courant a la priorité sur la bibliothèque standard!
  63. # À noter
  64. Seul deux des composants sont accessibles en *écriture* par
  65. mon utilisateur courant:
  66. * Le chemin courant
  67. * Un chemin dans mon $HOME (`~/.local/lib/python3.7/site-packages/`)
  68. Même principe sur macOS et Windows (presque)
  69. # Bibliothèques tierces
  70. Par example, pour faire des jolis tableaux:
  71. ```python
  72. import tabulate
  73. scores = [
  74. ["John", 345],
  75. ["Mary-Jane", 2],
  76. ["Bob", 543],
  77. ]
  78. table = tabulate.tabulate(scores)
  79. print(table)
  80. ```
  81. ```
  82. --------- ---
  83. John 345
  84. Mary-Jane 2
  85. Bob 543
  86. --------- ---
  87. ```
  88. # Le problème
  89. On peut trouver le code source de `tabulate` facilement.
  90. Mais comment faire pour le mettre dans `sys.path`?
  91. # Dans la distribution
  92. Si vous êtes sous Linux, peut-être que vous pouvez utiliser votre
  93. gestionnaire de paquets.
  94. Du genre: `sudo apt install python3-tabulate`.
  95. # À la main
  96. On peut récupérer les sources et les installer avec `python3 setup.py install --user`
  97. * Quasiment *tous* les projets python ont un `setup.py` utilisable de cette façon.
  98. * On utilise `--user` pour éviter des problèmes de permissions
  99. * Démo!
  100. # Anatomie du setup.py
  101. Un appel à `setuptools.setup()`. C'est tout
  102. ```python
  103. from setuptools import setup
  104. setup(
  105. name='tabulate',
  106. version='0.8.1',
  107. description='Pretty-print tabular data',
  108. py_modules=["tabulate"],
  109. scripts=["bin/tabulate"],
  110. ...
  111. )
  112. ```
  113. # À noter
  114. Sur linux, si le paquet contient des *scripts*, ils arriveront dans `~/.local/bin`.
  115. Sous macOS et Windows, ce sera un autre emplacement, mais qui *dépendra de la version de Python*.
  116. Il faudra peut-être changer le PATH sur votre machine si vous voulez lancer les scripts
  117. directement. Ou alors, utilisez `python3 -m` (quand c'est possible).
  118. Example:
  119. ```
  120. python3 -m tabulate
  121. ```
  122. # Dépendances
  123. Prenons une autre bibliothèque: `cli-ui`.
  124. Elle sert à faire des jolis programmes en couleur:
  125. ```python
  126. import cli_ui
  127. cli_ui.info_1("Ceci est une info importante")
  128. cli_ui.info("Ceci est en", cli_ui.bold, "gras")
  129. ```
  130. # Dépendances de cli-ui
  131. En fait, `cli-ui` utilise *d'autres* bibliothèques.
  132. Par exemple:
  133. ```python
  134. headers=["name", "score"]
  135. data = [
  136. [(bold, "John"), (green, 10.0)],
  137. [(bold, "Jane"), (green, 5.0)],
  138. ]
  139. cli_ui.info_table(data, headers=headers)
  140. ```
  141. Devinez qui s'occupe d'afficher le tableau!
  142. # Déclaration des dépendances
  143. Aussi dans setup.py:
  144. ```python
  145. setup(
  146. name="cli-ui",
  147. version="0.9.1",
  148. install_requires=[
  149. "tabulate",
  150. ...
  151. ],
  152. ...
  153. )
  154. ```
  155. # pypi
  156. pypi.org: un site que recense plein de bibliothèques python.
  157. Vive l'open source!
  158. cli-ui et tabulate y sont présents.
  159. # pip
  160. * `pip` vient par défaut avec Python3
  161. * Vous pouvez aussi l'installer avec `get-pip.py` (python3 get-pip.py --user)
  162. * Toujours le lancer avec `python3 -m pip`.
  163. # Intérêt de pip
  164. * Va chercher tout seul sur `pypi`
  165. * Lance `setup.py` tout seul (pour trouver les dépendances, et les installer)
  166. * S'utilise avec `python3 -m pip install --user ...`
  167. # Fonctionnalités en plus
  168. * Peut supprimer quelque chose installé - `python3 -m pip uninstall <>`
  169. * Peut chercher sur `pypi` directement - `python3 -m pip search <>`
  170. * Peut lister ce qui est installé - `python3 -m pip freeze`
  171. # Limitations de pip seul
  172. * Il faut penser à utiliser `--user`
  173. * Si le paquet est déjà installé dans le système (genre `/usr/lib/` sous Linux),
  174. pip ne saura pas le mettre à jour - il faudra passer par le gestionnaire de paquet de
  175. la distribution
  176. # Versions de dépendances
  177. Parfois, les versions sont incompatibles entre elles!
  178. https://tankerhq.github.io/python-cli-ui/changelog.html#v0-8-0
  179. # Solution
  180. On peut donner des versions dans `setup.py`:
  181. ```python
  182. install_requires=[
  183. "cli-ui < 0.8",
  184. ...
  185. ]
  186. ```
  187. # Apparté - pourquoi sudo pip c'est pas une bonne idée
  188. Les fichiers dans `/usr/lib` sont contrôllés par votre gestionnaire de paquet.
  189. Les mainteneurs de votre distribution font en sorte qu'ils marchent bien les uns
  190. avec les autres.
  191. Si vous lancer `sudo pip` vous risquez de casser votre système.
  192. # Plusieurs projets
  193. * Projet A utilise `cli-ui` 0.7
  194. * Projet B utilise `cli-ui` 0.9
  195. Comment faire pour travailler sur les deux projets?
  196. # Environements virtuels
  197. * Un répertoire *isolé* du reste du système.
  198. * Contient un binaire python légèrement différent du binaire ordinaire.
  199. * Se crée avec `python3 -m venv <le chemin>` - sauf sous Debian ;-(
  200. # Avec virtualenv
  201. * Vous pouvez aussi installer `virtualenv` avec pip puis utiliser `virtualenv`
  202. ```bash
  203. $ python3 -m pip install virtualenv --user
  204. $ python3 -m virtualenv <le chemin>
  205. ```
  206. # L'isolation en pratique
  207. * Plus de chemin dans `~/.local/lib`
  208. * Moins de chemins dans le système
  209. * Les scripts restent dans le virtualenv
  210. # Pip + Virtualenv = <3
  211. Et vous avez aussi un `pip` spécial dans `/le chemin/bin/pip`
  212. * Plus besoin de `--user`
  213. * On peut créér deux virtualenvs différent pour les projets A et B
  214. # Activer un virtualenv
  215. Si taper le chemin du virtualenv vous embête, vous pouves
  216. *l'activer* avec `source <chemin>/bin/activate`
  217. Pour sortir: `deactivate`.
  218. # Les règles
  219. * Un virtualenv par projet et par version de Python
  220. * Toujours utiliser pip depuis un virtualenv
  221. C'est plus long, mais ça vous évitera un tas de problèmes ...
  222. # Pour aller plus loin
  223. * PYTHONPATH
  224. * `requirements.txt`
  225. * `pipenv`
  226. * `poetry`
  227. On y reviendra
  228. #
  229. \center \huge À vous de jouer!
  230. #
  231. Pas d'atelier collectif cette fois. Objectif:
  232. * Créer un virtualenv et installer pygame dedans
  233. * Suivre le tutoriel par vous-même :)
  234. https://nerdparadise.com/programming/pygame
  235. Questions à dimitri@e2li.org