選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
このリポジトリはアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュや、課題・プルリクエストのオープンはできません。

python-11.md 6.8 KiB

5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
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