Skip to article frontmatterSkip to article content

bibliothèque standard

un grand nombre d’outils installés d’office
pour des tâches très variées voir liste complète

cette boite à outils est exposée au travers de modules
que l’on peut charger dans son appli grâce au mot-clé import

import

# import permet de charger un code
import math
# cela définit une variable, ici 'math'
# qui est une référence
# vers un objet module
math
type(math)
module
# cet objet possède des attributs
# auxquels on peut accéder
# avec la notation module.attribut

math.pi
3.141592653589793

autres formes

# avec cette forme on ne définit pas la variable math
# mais directement la variable pi

from math import pi
pi
3.141592653589793
# ici on n'a importé que le nom 'pi'
# et donc 'cos' n'est pas défini
# mais grâce au 'import math'
# on peut y accéder par math.cos

math.cos(pi)
-1.0

installation de librairies tierces

si on a besoin d’installer un module
qui ne fait pas partie de la bibliothèque standard :

# cette astuce avec le ! me permet
# d'appeler une commande normalement destinée au terminal
# mais depuis Python

!pip install nbautoeval
Defaulting to user installation because normal site-packages is not writeable
Collecting nbautoeval
  Downloading nbautoeval-1.8.0-py3-none-any.whl.metadata (5.0 kB)
Requirement already satisfied: ipython in /home/runner/.local/lib/python3.12/site-packages (from nbautoeval) (9.5.0)
Requirement already satisfied: ipywidgets in /home/runner/.local/lib/python3.12/site-packages (from nbautoeval) (8.1.7)
Collecting myst-parser (from nbautoeval)
  Downloading myst_parser-4.0.1-py3-none-any.whl.metadata (5.5 kB)
Requirement already satisfied: numpy in /home/runner/.local/lib/python3.12/site-packages (from nbautoeval) (2.3.3)
Requirement already satisfied: pyyaml in /usr/lib/python3/dist-packages (from nbautoeval) (6.0.1)
Requirement already satisfied: decorator in /home/runner/.local/lib/python3.12/site-packages (from ipython->nbautoeval) (5.2.1)
Requirement already satisfied: ipython-pygments-lexers in /home/runner/.local/lib/python3.12/site-packages (from ipython->nbautoeval) (1.1.1)
Requirement already satisfied: jedi>=0.16 in /home/runner/.local/lib/python3.12/site-packages (from ipython->nbautoeval) (0.19.2)
Requirement already satisfied: matplotlib-inline in /home/runner/.local/lib/python3.12/site-packages (from ipython->nbautoeval) (0.1.7)
Requirement already satisfied: pexpect>4.3 in /usr/lib/python3/dist-packages (from ipython->nbautoeval) (4.9.0)
Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in /home/runner/.local/lib/python3.12/site-packages (from ipython->nbautoeval) (3.0.52)
Requirement already satisfied: pygments>=2.4.0 in /usr/lib/python3/dist-packages (from ipython->nbautoeval) (2.17.2)
Requirement already satisfied: stack_data in /home/runner/.local/lib/python3.12/site-packages (from ipython->nbautoeval) (0.6.3)
Requirement already satisfied: traitlets>=5.13.0 in /home/runner/.local/lib/python3.12/site-packages (from ipython->nbautoeval) (5.14.3)
Requirement already satisfied: comm>=0.1.3 in /home/runner/.local/lib/python3.12/site-packages (from ipywidgets->nbautoeval) (0.2.3)
Requirement already satisfied: widgetsnbextension~=4.0.14 in /home/runner/.local/lib/python3.12/site-packages (from ipywidgets->nbautoeval) (4.0.14)
Requirement already satisfied: jupyterlab_widgets~=3.0.15 in /home/runner/.local/lib/python3.12/site-packages (from ipywidgets->nbautoeval) (3.0.15)
Collecting docutils<0.22,>=0.19 (from myst-parser->nbautoeval)
  Downloading docutils-0.21.2-py3-none-any.whl.metadata (2.8 kB)
Requirement already satisfied: jinja2 in /usr/lib/python3/dist-packages (from myst-parser->nbautoeval) (3.1.2)
Requirement already satisfied: markdown-it-py~=3.0 in /usr/lib/python3/dist-packages (from myst-parser->nbautoeval) (3.0.0)
Requirement already satisfied: mdit-py-plugins>=0.4.1,~=0.4 in /home/runner/.local/lib/python3.12/site-packages (from myst-parser->nbautoeval) (0.5.0)
Collecting sphinx<9,>=7 (from myst-parser->nbautoeval)
  Downloading sphinx-8.2.3-py3-none-any.whl.metadata (7.0 kB)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in /home/runner/.local/lib/python3.12/site-packages (from jedi>=0.16->ipython->nbautoeval) (0.8.5)
Requirement already satisfied: mdurl~=0.1 in /usr/lib/python3/dist-packages (from markdown-it-py~=3.0->myst-parser->nbautoeval) (0.1.2)
Requirement already satisfied: wcwidth in /home/runner/.local/lib/python3.12/site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython->nbautoeval) (0.2.13)
Collecting sphinxcontrib-applehelp>=1.0.7 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading sphinxcontrib_applehelp-2.0.0-py3-none-any.whl.metadata (2.3 kB)
Collecting sphinxcontrib-devhelp>=1.0.6 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading sphinxcontrib_devhelp-2.0.0-py3-none-any.whl.metadata (2.3 kB)
Collecting sphinxcontrib-htmlhelp>=2.0.6 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl.metadata (2.3 kB)
Collecting sphinxcontrib-jsmath>=1.0.1 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl.metadata (1.4 kB)
Collecting sphinxcontrib-qthelp>=1.0.6 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading sphinxcontrib_qthelp-2.0.0-py3-none-any.whl.metadata (2.3 kB)
Collecting sphinxcontrib-serializinghtml>=1.1.9 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl.metadata (2.4 kB)
Collecting snowballstemmer>=2.2 (from sphinx<9,>=7->myst-parser->nbautoeval)

  Downloading snowballstemmer-3.0.1-py3-none-any.whl.metadata (7.9 kB)
Collecting babel>=2.13 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading babel-2.17.0-py3-none-any.whl.metadata (2.0 kB)
Collecting alabaster>=0.7.14 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading alabaster-1.0.0-py3-none-any.whl.metadata (2.8 kB)
Collecting imagesize>=1.3 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading imagesize-1.4.1-py2.py3-none-any.whl.metadata (1.5 kB)
Requirement already satisfied: requests>=2.30.0 in /usr/lib/python3/dist-packages (from sphinx<9,>=7->myst-parser->nbautoeval) (2.31.0)
Collecting roman-numerals-py>=1.0.0 (from sphinx<9,>=7->myst-parser->nbautoeval)
  Downloading roman_numerals_py-3.1.0-py3-none-any.whl.metadata (3.6 kB)
Requirement already satisfied: packaging>=23.0 in /usr/lib/python3/dist-packages (from sphinx<9,>=7->myst-parser->nbautoeval) (24.0)
Requirement already satisfied: executing>=1.2.0 in /home/runner/.local/lib/python3.12/site-packages (from stack_data->ipython->nbautoeval) (2.2.1)
Requirement already satisfied: asttokens>=2.1.0 in /home/runner/.local/lib/python3.12/site-packages (from stack_data->ipython->nbautoeval) (3.0.0)
Requirement already satisfied: pure-eval in /home/runner/.local/lib/python3.12/site-packages (from stack_data->ipython->nbautoeval) (0.2.3)
Downloading nbautoeval-1.8.0-py3-none-any.whl (47 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/47.9 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 47.9/47.9 kB 3.3 MB/s eta 0:00:00
Downloading myst_parser-4.0.1-py3-none-any.whl (84 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/84.6 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 84.6/84.6 kB 6.0 MB/s eta 0:00:00
Downloading docutils-0.21.2-py3-none-any.whl (587 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/587.4 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 587.4/587.4 kB 23.7 MB/s eta 0:00:00
Downloading sphinx-8.2.3-py3-none-any.whl (3.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/3.6 MB 36.7 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/3.6 MB 30.4 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 30.9 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 24.1 MB/s eta 0:00:00
Downloading alabaster-1.0.0-py3-none-any.whl (13 kB)
Downloading babel-2.17.0-py3-none-any.whl (10.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/10.2 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/10.2 MB 32.3 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.0/10.2 MB 20.3 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.7/10.2 MB 24.7 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.6/10.2 MB 27.6 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1/10.2 MB 28.8 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.2/10.2 MB 29.6 MB/s eta 0:00:010:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.2/10.2 MB 24.5 MB/s eta 0:00:0000:01
Downloading imagesize-1.4.1-py2.py3-none-any.whl (8.8 kB)
Downloading roman_numerals_py-3.1.0-py3-none-any.whl (7.7 kB)
Downloading snowballstemmer-3.0.1-py3-none-any.whl (103 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/103.3 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.3/103.3 kB 7.6 MB/s eta 0:00:00
Downloading sphinxcontrib_applehelp-2.0.0-py3-none-any.whl (119 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/119.3 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.3/119.3 kB 7.1 MB/s eta 0:00:00
Downloading sphinxcontrib_devhelp-2.0.0-py3-none-any.whl (82 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/82.5 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 82.5/82.5 kB 6.2 MB/s eta 0:00:00
Downloading sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl (98 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.7/98.7 kB 6.5 MB/s eta 0:00:00
Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB)
Downloading sphinxcontrib_qthelp-2.0.0-py3-none-any.whl (88 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/88.7 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 88.7/88.7 kB 6.0 MB/s eta 0:00:00
Downloading sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl (92 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/92.1 kB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 92.1/92.1 kB 4.3 MB/s eta 0:00:00
Installing collected packages: sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, snowballstemmer, roman-numerals-py, imagesize, docutils, babel, alabaster, sphinx, myst-parser, nbautoeval
Successfully installed alabaster-1.0.0 babel-2.17.0 docutils-0.21.2 imagesize-1.4.1 myst-parser-4.0.1 nbautoeval-1.8.0 roman-numerals-py-3.1.0 snowballstemmer-3.0.1 sphinx-8.2.3 sphinxcontrib-applehelp-2.0.0 sphinxcontrib-devhelp-2.0.0 sphinxcontrib-htmlhelp-2.1.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-2.0.0 sphinxcontrib-serializinghtml-2.0.0
import nbautoeval

c’est quoi un module ?

un module est un objet Python qui correspond à un fichier (ou répertoire) source
depuis cet objet vous pouvez accéder à des attributs
avec la notation module.attribut
(qui est btw la même notion que, par ex., str.capitalize)
le module a autant d’attributs que d’objets globaux dans le code source
dans le cas d’un répertoire les attributs référencent d’autres modules

# regarder le contenu
!cat mod.py
GLOBALE = 100

def spam(data):
    print(f"dans mod.spam, data={data}")
import mod

# tous les noms dans le module (y compris les noms "internes")
dir(mod)
['GLOBALE', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'spam']
# pour afficher tous les attributs du module
# et une fois le bruit éliminé
[x for x in dir(mod) if '__' not in x]
['GLOBALE', 'spam']

notion de point d’entrée

votre programme Python est toujours exécuté par un interpréteur
qui “commence” quelque part: c’est le point d’entrée

si vous lancez

$ python3 foo.py

le point d’entrée dans ce cas est (le module correspondant à) foo.py

recherche des modules

Python recherche les modules dans plusieurs d’endroits (répertoires)

conseil : évitez de bidouiller PYTHONPATH

organisation de votre code

cela signifie que pour commencer,
on peut sans souci couper son code en fichiers
et les mettre tous dans le même répertoire

c’est une pratique courante et recommandée
il faut apprendre à découper
notamment pour augmenter la réutilisabilité

librairies utiles

liste largement non exhaustive

module pathlib

fait partie de la librairie standard
permet de faire des calculs sur les fichiers

# ici Path correspond à une classe
# on verra la théorie très bientôt
from pathlib import Path

# on recherche dans le répertoire courant '.'
# les fichiers/répertoires d'extension '.ipynb'
local_files = Path('.').glob('*.ipynb')

# observons les fichiers trouvés
for file in local_files:
    print('name', file.name)
    print('stem', file.stem)
    print('suffix', file.suffix)
    print('absolute()', file.absolute())
    print('size', file.stat().st_size)
    break

module random

une fois que vous avez le nom du module,
il vous suffit de consulter la doc complète
pour cela taper dans google python random module
(nous reviendrons sur ce module lors de l’étude des librairies numériques)

import random

# entre 0 et 1
random.random()
0.5975857059202976
# un entier entre deux bornes
# inclusivement
random.randint(0, 10)
1

module requests

télécharger du contenu depuis une URL
accéder à l’entête http plus flexible que l’équivalent dans la librairie standard urllib2

import requests

url = ""
url = "https://github.com/timeline.json"

request = requests.get(url)

print(f"code de retour HTTP: {request.status_code}")
code de retour HTTP: 410
raw_content = request.text
# une chaine de caractères
type(raw_content)
str
# le début de cette chaine
raw_content[:120]
# son contenu est en format json (voir slide suivante)
'{"message":"Hello there, wayfaring stranger. If you’re reading this then you probably didn’t see our blog post a couple '

module json

le cas qu’on vient de voir est très fréquent
JSON est un format texte (compatible réseau donc Internet)
mais qui conserve un minimum de structure : permet de transmettre listes et dictionnaires

# pour décoder le JSON qu'on a lu
# et qui est dans la str raw_content
import json

decoded = json.loads(raw_content)
type(decoded) # la chaîne contenait un dict Pyhon
dict
# cette fois on a un peu
# de structure
for k, v in decoded.items():
    print(f"{k}\n\t{v[:20]}...")
message
	Hello there, wayfari...
documentation_url
	https://docs.github....

gestion de fichiers

# pour écrire dans un fichier
with open("tutu.txt", "w") as writer:
    for i in range(4):
        print(f"i={i}", file=writer)

with open... ouvre le fichier tutu.txt en écriture "w"
et crée la variable writer de type File
writer n’est visible que dans le with
print(..., file=writer) écrit dans ce fichier
with ferme le fichier à la sortie
(nous allons maintenant lire ce fichier)

fichiers - suite

# à l'envers, on relit le fichier
with open('tutu.txt') as reader:
    for line in reader:
        print(line, end="")
i=0
i=1
i=2
i=3

sans préciser le mode d’ouverture
open ouvre le fichier en lecture
l’objet reader est itérable

la variable line contient une fin de ligne
pas besoin que print en rajoute une

exercice

écrire une fonction json_random() qui retourne :

 # n'oubliez pas d'importer les modules
# dont vous avez besoin
def random_json():
    """
    returns a JSON-encoded of a list
    of 2 to 5 values between 2 and 5
    """
    # votre code ici
    pass
from check_random_json import check_random_json

check_random_json(random_json)
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[23], line 1
----> 1 from check_random_json import check_random_json
      3 check_random_json(random_json)

ModuleNotFoundError: No module named 'check_random_json'