Licence CC BY-NC-ND Thierry Parmentelat
_images/inria-25-alpha.png
%load_ext autoreload
%autoreload 2

modules

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
<module 'math' from '/usr/share/miniconda/envs/python-numérique/lib/python3.9/lib-dynload/math.cpython-39-x86_64-linux-gnu.so'>
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 cos n'est pas défini, math.cos l'est

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 :

  • répertoire disponible sur https://pypi.org/

  • installation à faire avec l’outil pip
    (se lance depuis le terminal)

# cette astuce avec le ! me permet
# d'appeler une commande normalement destinée au terminal
# mais depuis Python
  
!pip search nbautoeval
ERROR: XMLRPC request failed [code: -32500]
RuntimeError: PyPI's XMLRPC API is currently disabled due to unmanageable load and will be deprecated in the near future. See https://status.python.org/ for more information.
!pip install nbautoeval
Requirement already satisfied: nbautoeval in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (1.7.0)
Requirement already satisfied: numpy in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (1.21.1)
Requirement already satisfied: ipywidgets in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (7.6.3)
Requirement already satisfied: ipython in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (7.25.0)
Requirement already satisfied: PyYAML in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (5.4.1)
Requirement already satisfied: myst-parser in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (0.13.7)
Requirement already satisfied: jedi>=0.16 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.18.0)
Requirement already satisfied: matplotlib-inline in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.1.2)
Requirement already satisfied: setuptools>=18.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (52.0.0.post20210125)
Requirement already satisfied: pickleshare in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.7.5)
Requirement already satisfied: pexpect>4.3 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (4.8.0)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (3.0.19)
Requirement already satisfied: traitlets>=4.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (5.0.5)
Requirement already satisfied: backcall in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.2.0)
Requirement already satisfied: pygments in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (2.9.0)
Requirement already satisfied: decorator in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (5.0.9)
Requirement already satisfied: parso<0.9.0,>=0.8.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jedi>=0.16->ipython->nbautoeval) (0.8.2)
Requirement already satisfied: ptyprocess>=0.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from pexpect>4.3->ipython->nbautoeval) (0.7.0)
Requirement already satisfied: wcwidth in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython->nbautoeval) (0.2.5)
Requirement already satisfied: ipython-genutils in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from traitlets>=4.2->ipython->nbautoeval) (0.2.0)
Requirement already satisfied: nbformat>=4.2.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (5.1.3)
Requirement already satisfied: widgetsnbextension~=3.5.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (3.5.1)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (1.0.0)
Requirement already satisfied: ipykernel>=4.5.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (6.0.3)
Requirement already satisfied: tornado<7.0,>=4.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets->nbautoeval) (6.1)
Requirement already satisfied: debugpy<2.0,>=1.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets->nbautoeval) (1.4.1)
Requirement already satisfied: jupyter-client<7.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets->nbautoeval) (6.1.12)
Requirement already satisfied: jupyter-core>=4.6.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jupyter-client<7.0->ipykernel>=4.5.1->ipywidgets->nbautoeval) (4.7.1)
Requirement already satisfied: pyzmq>=13 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jupyter-client<7.0->ipykernel>=4.5.1->ipywidgets->nbautoeval) (22.1.0)
Requirement already satisfied: python-dateutil>=2.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jupyter-client<7.0->ipykernel>=4.5.1->ipywidgets->nbautoeval) (2.8.2)
Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbformat>=4.2.0->ipywidgets->nbautoeval) (3.2.0)
Requirement already satisfied: six>=1.11.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nbautoeval) (1.16.0)
Requirement already satisfied: pyrsistent>=0.14.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nbautoeval) (0.18.0)
Requirement already satisfied: attrs>=17.4.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nbautoeval) (20.3.0)
Requirement already satisfied: notebook>=4.4.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (6.4.0)
Requirement already satisfied: Send2Trash>=1.5.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (1.7.1)
Requirement already satisfied: argon2-cffi in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (20.1.0)
Requirement already satisfied: terminado>=0.8.3 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.10.1)
Requirement already satisfied: prometheus-client in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.11.0)
Requirement already satisfied: jinja2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (3.0.1)
Requirement already satisfied: nbconvert in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (5.6.1)
Requirement already satisfied: cffi>=1.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (1.14.6)
Requirement already satisfied: pycparser in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (2.20)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (2.0.1)
Requirement already satisfied: docutils<0.18,>=0.15 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (0.16)
Requirement already satisfied: mdit-py-plugins~=0.2.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (0.2.6)
Requirement already satisfied: markdown-it-py~=0.6.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (0.6.2)
Requirement already satisfied: sphinx<4,>=2.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (3.5.4)
Requirement already satisfied: sphinxcontrib-htmlhelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.0.0)
Requirement already satisfied: sphinxcontrib-applehelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.2)
Requirement already satisfied: sphinxcontrib-jsmath in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.1)
Requirement already satisfied: snowballstemmer>=1.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.1.0)
Requirement already satisfied: babel>=1.3 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.9.1)
Requirement already satisfied: sphinxcontrib-serializinghtml in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.1.5)
Requirement already satisfied: sphinxcontrib-devhelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.2)
Requirement already satisfied: packaging in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (21.0)
Requirement already satisfied: imagesize in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.2.0)
Requirement already satisfied: sphinxcontrib-qthelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.3)
Requirement already satisfied: requests>=2.5.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.26.0)
Requirement already satisfied: alabaster<0.8,>=0.7 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (0.7.12)
Requirement already satisfied: pytz>=2015.7 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from babel>=1.3->sphinx<4,>=2.1->myst-parser->nbautoeval) (2021.1)
Requirement already satisfied: certifi>=2017.4.17 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (2021.5.30)
Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (2.0.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (1.26.6)
Requirement already satisfied: idna<4,>=2.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (3.2)
Requirement already satisfied: testpath in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.5.0)
Requirement already satisfied: entrypoints>=0.2.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.3)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (1.4.3)
Requirement already satisfied: mistune<2,>=0.8.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.8.4)
Requirement already satisfied: bleach in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (3.3.1)
Requirement already satisfied: defusedxml in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.7.1)
Requirement already satisfied: webencodings in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.5.1)
Requirement already satisfied: pyparsing>=2.0.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from packaging->sphinx<4,>=2.1->myst-parser->nbautoeval) (2.4.7)
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 la même notion que, par ex., str.capitalize)
le module a autant d’attributs que d’objets globaux dans le source
dans le cas d’un répertoire les attributs référencent d’autres modules

# regarder le contenu
!cat mod.py
# variable globale au module
foo = 1

# fonction globale au module
def bar(n):
    x = 10
    print(f"dans bar, n={n} et x={x}")
import mod

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

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)

  • le répertoire qui contient le point d’entrée

  • en option, la variable d’environnement PYTHONPATH

  • là où sont installés les morceaux de la librairie standard

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

  • gestion des fichiers: from pathlib import Path

  • génération de nombres aléatoires import random

  • télécharger depuis Internet: import requests

  • ouverture de fichiers au format JSON: import json (standard)

  • Python scientifique: numpy, pandas, matplotlib, …

module pathlib

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

  • lister les fichiers présents

  • calculs sur les chemins et noms de fichier

  • accéder aux métadata (taille, date, …)

# 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.15174514497850267
# un entier entre deux bornes
# inclusivement
random.randint(0, 10)
9

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 :

  • une chaine de caractères

  • qui correspond à l’encodage en JSON

  • d’une liste contenant - au hasard - entre 2 et 5 valeurs numériques

  • elles-mêmes tirées au hasard dans l’intervalle $[2 .. 5]$

 # 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)
ERROR:root:result None is not a str
ERROR:root:nope, try again