Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Paquets, modules et bibliothèques

Import external libraries and organize your code into functional chunks. For interactive reading and executing code blocks Binder and find b05-pypckg.ipynb, or install Python and JupyterLab locally.

Importer des paquets ou des modules

L’importation d’un paquet ou d’un module dans Python rend les fonctions externes et d’autres éléments (tels que les objets) des modules accessibles dans un script. Les fonctions et autres éléments sont stockés dans un autre fichier Python (.py) dans certains dossiers /site packages/ (répertoire) des environnements interprètes. Ainsi, pour utiliser un paquet non standard, il doit d’abord être téléchargé et installé. Les paquets Python standard (par exemple, os, math) sont toujours accessibles, et d’autres peuvent être ajoutés avec conda ou pip (read more pip-installing).

Le paquet os fournit des commandes de base de type système-terminal, par exemple, pour gérer les répertoires de dossiers. Importons donc ce paquet essentiel :

import os
print(os.getcwd()) # print current working directory
print(os.path.abspath('')) # print directory of script running
/home/schwindt/github/hyhome-v2/jupyter
/home/schwindt/github/hyhome-v2/jupyter

Aperçu des options d’importation

Voici un aperçu des options pour importer des paquets ou des modules (parties hiérarchiques des paquets):

CommandDescriptionUsage of attributes
import package-nameImport an original modulepackage.item()
import package-name as nick-nameImport module and rename (alias) it in the scriptnick-name.item()
from package-name import itemImport only a function, class or other itemsitem()
from package-name import *Import all itemsitem()

Exemple

import matplotlib.pyplot as plt # import pyplot from the matplotlib module and alias it with plt
import math as m

x = []
y = []

for e in range(1, 10):
    x.append(e)
    y.append(e**2)

plt.plot(x, y)
<Figure size 640x480 with 1 Axes>

Quelle est la meilleure façon d’importer un paquet ou un module?

Il n’y a pas de réponse globale à cette question. Cependant, sachez que from package-name import * écrase toute variable existante ou tout autre élément du script. Ainsi, n’utilisez * que lorsque vous connaissez tout le contenu d’un module ou d’un paquet.

pi = 9.112 # define a float called pi 
print("Pi is not %1.3f." % pi)

from math import pi # this overwrites the before defined variable pi
print("Pi is %1.3f." % pi)
Pi is not 9.112.
Pi is 3.142.

Quels sont les éléments (attributs, classes, fonctions) dans un module?

Parfois, nous voulons explorer des modules ou vérifier des attributs variables. Ceci est réalisé avec la commande dir():

import sys
print(sys.path)
print(dir(sys.path))

a_string = "zabaglione"
print(", ".join(dir(a_string)))
['/home/schwindt/miniforge3/envs/wrr-proj/lib/python311.zip', '/home/schwindt/miniforge3/envs/wrr-proj/lib/python3.11', '/home/schwindt/miniforge3/envs/wrr-proj/lib/python3.11/lib-dynload', '', '/home/schwindt/miniforge3/envs/wrr-proj/lib/python3.11/site-packages']
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
__add__, __class__, __contains__, __delattr__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __getnewargs__, __getstate__, __gt__, __hash__, __init__, __init_subclass__, __iter__, __le__, __len__, __lt__, __mod__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__, __setattr__, __sizeof__, __str__, __subclasshook__, capitalize, casefold, center, count, encode, endswith, expandtabs, find, format, format_map, index, isalnum, isalpha, isascii, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper, join, ljust, lower, lstrip, maketrans, partition, removeprefix, removesuffix, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill

Créer un nouveau module

Dans la programmation orientée objet et la factorisation de code, l’écriture personnalisée, de nouveaux modules est une tâche essentielle. Pour écrire un nouveau module, créez d’abord un nouveau script. Ensuite, ouvrez le nouveau script et ajoutez quelques paramètres et fonctions.

# icecreamdialogue.py
flavors = ["vanilla", "chocolate", "bread"]
price_scoops = {1: "two euros", 2: "three euros", 3: "your health"}
welcome_msg = "Hi, I only have " + flavors[0] + ". How many scoops do you want?"

icecreamdialogue.py can now either be executed as a script (nothing will happen visibly) or imported as a module to access its variables (e.g., icecreamdialogue.flavors):

import icecreamdialogue as icd
print(icd.welcome_msg)
scoops_wanted = 2
print("That makes {0} please".format(icd.price_scoops[scoops_wanted]))

Faites du script autonome

As an alternative, we can append the call to items in icecreamdialogue.py in the script and run it as a stand-alone script by adding an if __name__ == "__main__": block:

# icecreamdialogue_standalone.py
flavors = ["vanilla", "chocolate", "bread"]
price_scoops = {1: "two euros", 2: "three euros", 3: "your health"}
welcome_msg = "Hi, I only have " + flavors[0] + ". How many scoops do you want?"


if __name__ == "__main__":
    print(welcome_msg)
    scoops_wanted = 2
    print("That makes {0} please".format(price_scoops[scoops_wanted]))
Hi, I only have vanilla. How many scoops do you want?
That makes three euros please

Now we can run icecreamdialogue_standalone.py in a terminal (e.g., Linux Terminal, PyCharm’s Terminal tab at the bottom of the window, or VS Code’s integrated terminal).

C:\temp\ python icecreamdialogue_standalone.py

Scripts autonomes avec paramètres d’entrée

Pour rendre le script plus flexible, nous pouvons définir, par exemple, scoops_wanted comme variable d’entrée d’une fonction.

# icecreamdialogue_standalone_withinput.py
flavors = ["vanilla", "chocolate", "bread"]
price_scoops = {1: "two euros", 2: "three euros", 3: "your health"}
welcome_msg = "Hi, I only have " + flavors[0] + ". How many scoops do you want?"

def dialogue(scoops_wanted): #formerly in the __main__ statement
    print(welcome_msg)
    print("That makes {0} please".format(price_scoops[scoops_wanted]))

if __name__ == "__main__":
    # import the terminal function emulator sys
    import sys
    if len(sys.argv) > 1: # make sure input is provided
        # if true: call the dialogue function with the input argument
        dialogue(int(sys.argv[1]))

Maintenant, nous pouvons lancer icecreamdialogue_standalone_withinput.py dans un terminal.

C:\temp\ python3 icecreamdialogue_standalone.py 2

Initialisation d’un paquet (module organisé de façon hiérarchisée)

La bonne pratique implique qu’un script ne dépasse pas 50 à 100 lignes de code (sauf les documents en ligne et les variables multilignes). En conséquence, un paquet sera probablement composé de plusieurs scripts qui sont stockés dans un dossier et un script de base sert pour l’initiation des scripts. Ce script principal s’appelle __init__.py et Python invoquera toujours ce nom de script dans un dossier de paquetage. Exemple de structure d’un module appelé icecreamery:

  • icecreamery (nom du dossier)

    • __init__.py - initiation du paquet * script Python*

    • icecreamdialogue.py - dialogue produisant le script Python

    • icecream_maker.py - production de crème glacée virtuelle * script Python*

Pour invoquer automatiquement les deux scripts pertinents (sous-modules) du module icecreamery, le __init__.py doit inclure les éléments suivants :

# __init__.py
print(f'Invoking __init__.py for {__name__}') # not absolutely needed ..
import icecreamery.icecreamdialogue, icecreamery.icecream_maker
# example usage of the icecreamery package
import icecreamery
print(icecreamery.icecreamdialogue.welcome_msg)

Vous souvenez-vous de la fonction dir()? Il est destiné à énumérer tous les modules dans un paquet, mais il ne le fait pas à moins que nous définissions une liste __all__ dans le __init__.py.

# __init__.py with __all__ list
__all__ = ['icecreamdialogue', 'icecream_maker']

L’exemple complet du paquet icecreamery_all est également disponible dans un dépôt icecream.

# example usage of the icecreamery package
from icecreamery_all import *
print(icecreamdialogue.welcome_msg)

Sommaire de la création du paquet

Un paquet hiérarchiquement organisé contient un fichier __init__.py avec une liste __all__ pour invoquer les scripts de module pertinents. La structure d’un module peut être plus complexe que la liste d’exemples ci-dessus (par exemple, avec des sous-dossiers). Lorsque vous écrivez un paquet, pensez à utiliser meaningful script and variable names, avec la documentation appropriée.

Recharger (réimporter) un paquet ou un module

Depuis Python3, recharger un module nécessite d’importer le module importlib. Recharger n’a de sens que si vous écrivez activement un nouveau module. Pour recharger n’importe quel type de module :

import importlib
importlib.reload(my_module)

Vérification de la réussite en apprentissage

Prenez le test de réussite d’apprentissage pour ce carnet Jupyter.