Apprenez en lisant dans l'ordre

Modules et packages — Importer depuis d'autres fichiers

Apprends les différences entre modules, packages et bibliothèques Python, plus comment l'instruction import récupère des fonctions depuis d'autres fichiers.

Les applications Python sont généralement construites en répartissant le travail sur plusieurs fichiers et en les reliant. Cet article parcourt les unités appelées modules et packages, plus comment l'instruction import récupère des fonctionnalités depuis un autre fichier.

Module vs Package vs Bibliothèque

Python organise le code en trois tailles : module → package → bibliothèque. Un module est un seul fichier .py, un package est un dossier de modules, et une bibliothèque est l'échelon supérieur — un paquet distribuable.

Hiérarchie module / package / bibliothèque
ModuleUn fichier .pyPackageDossier avec __init__.pyBibliothèquepandas / NumPy / etc.regroupelivré comme
Les fichiers (modules) se rassemblent dans des dossiers (packages), et plusieurs packages sont distribués ensemble comme une seule bibliothèque (pandas, NumPy, etc.).
UnitéCe que c'estExemple
ModuleUn seul fichier .pymath_utility.py
PackageUn dossier contenant __init__.pymy_app/database/
BibliothèqueUne distribution d'un ou plusieurs packagespandas / NumPy / requests

Bibliothèque standard vs bibliothèque tierce

Python est livré avec une bibliothèque standard par défaut, et il existe des bibliothèques tierces que tu installes en plus. Les bibliothèques standard comme math, os et json fonctionnent avec un simple import. Les bibliothèques tierces comme pandas ou requests ont besoin de pip install nom_du_package au préalable.

TypeInstallationExemples
Bibliothèque standardLivrée avec Python (sans installation)math / os / sys / json / datetime
Bibliothèque tierceÀ ajouter via pip installpandas / numpy / requests

Essaie la bibliothèque standard math.

① Affiche le plafond entier de 1.7 avec math.ceil(1.7).

② Affiche la racine carrée de 3 avec math.sqrt(3).

(Si tu l'exécutes correctement, l'explication apparaît en dessous.)

Éditeur Python

Exécuter le code pour voir le résultat

Importer tes propres modules

Tu peux importer tes propres fichiers .py exactement comme la bibliothèque standard. Quand tu exécutes Python en local, place main.py et le fichier que tu veux importer (math_utility.py) dans le même dossier — c'est tout. Les fichiers du même dossier se chargent avec un simple import math_utility depuis main.py (pas de suffixe .py dans l'instruction d'import).

Disposition locale (fichiers côte à côte)
my_project/ ← le dossier du projet
  • main.py — le point d'entrée. Commence par import math_utility
  • math_utility.py — le module qui définit add() / multiply()
Place main.py et math_utility.py dans le même dossier. Python regarde d'abord le dossier du fichier en cours d'exécution, donc import math_utility trouve le voisin tout de suite — pas besoin de sous-dossier.
De import à l'appel d'une fonction
main.pyimport math_utilityPython chargele fichier depuisle même dossiermath_utility.add()math_utility.multiply()sont appelableschargefini
Quand import math_utility s'exécute, Python charge math_utility.py depuis le même dossier. Ensuite, tu peux appeler ses fonctions en tant que math_utility.add(...) avec le nom de module en préfixe.

math_utility.py est attaché à gauche (ouvre-le depuis 📂 Files pour l'inspecter).

① Charge-le avec import math_utility.

Appelle volontairement add(10, 20) sans le préfixe du module et confirme avec try/except que tu obtiens un NameErrorimport math_utility ne fait entrer que le nom math_utility lui-même dans la portée de main, donc add n'est pas directement appelable.

③ Ensuite affiche math_utility.add(10, 20) et math_utility.multiply(5, 5) avec le préfixe du nom de module — la bonne façon de les appeler.

Éditeur Python

Exécuter le code pour voir le résultat

import exécute le fichier entier une seule fois

Quand tu écris import math_utility, Python exécute math_utility.py de haut en bas une seule fois. Les définitions de fonctions (def) sont enregistrées en mémoire à ce moment-là, donc tu peux ensuite les appeler comme math_utility.add(...). Les corps de ces fonctions ne s'exécutent pas au moment de l'import — seul le code en dehors de toute fonction (le niveau supérieur du module) s'exécute.

À quoi ressemble le chargement d'un fichier externe
main.pyimport math_utilitymath_utility.pyexécuté de haut en basmath_utility.add()appelablechargeensuite
À l'instant où main.py atteint import math_utility, Python exécute math_utility.py de haut en bas. Les définitions def sont enregistrées en mémoire et deviennent appelables en tant que math_utility.add(...) ensuite.

Ne lance pas de tâches lourdes au niveau supérieur du module

Le niveau supérieur désigne le code situé à l'indentation la plus extérieure — en dehors de toute fonction ou classe. Python l'exécute de haut en bas chaque fois que le module est importé. Y placer des tâches lourdes (connexions BD, chargement de fichiers énormes, boucles infinies) signifie que simplement importer le module prend une éternité. Garde la logique lourde à l'intérieur des fonctions et ne laisse au niveau supérieur que les définitions et l'initialisation minimale.

Distinguer exécution directe et import — __name__

Les fichiers Python existent en deux saveurs : les scripts exécutés directement (que tu lances avec python xxx.py) et les modules importés par autre chose. Le même fichier peut jouer l'un ou l'autre rôle, et tu as souvent besoin de savoir lequel se produit — par exemple, « ne lancer un test rapide que si le fichier est exécuté directement ».

Le test utilise la variable spéciale __name__ que Python définit automatiquement. Quand le fichier est exécuté directement, __name__ vaut "__main__". Quand le fichier est importé, __name__ vaut le nom du module (le nom de fichier). Le code à l'intérieur de if __name__ == "__main__": ne s'exécute que dans le premier cas.

__name__ change selon la façon dont le fichier s'exécute
__name__(variable spécialedéfinie par Python)Exécuté directementpython xxx.py__name__= "__main__"Importé parun autre fichier__name__= "xxx"(nom du module)
La variable spéciale auto-définie __name__ vaut "__main__" quand tu exécutes le fichier directement (python xxx.py), et le nom du module (nom de fichier) quand un autre fichier l'importe.
# math_utility.py
def add(a, b):
    return a + b


# Test rapide uniquement à l'exécution directe
if __name__ == "__main__":
    print("check:", add(10, 20))   # 30

# Quand un autre fichier fait `import math_utility`,
# le bloc if ci-dessus ne s'exécute pas — seule la fonction add est exposée.

Le fichier joint math_utility_2.py définit une fonction show_name() qui affiche son propre __name__, plus un bloc if __name__ == "__main__": en bas (ouvre-le depuis 📂 Files pour regarder).

① Depuis le côté main, importe math_utility_2 et affiche le __name__ de main.

② Appelle math_utility_2.show_name() et vérifie ce à quoi ressemble __name__ du côté importé.

Éditeur Python

Exécuter le code pour voir le résultat

Combiner plusieurs de tes propres modules

Dans les vraies applications, tu répartis généralement les fonctions dans des fichiers séparés par responsabilité et tu les récupères toutes depuis main.py. Par exemple, les vérifications d'entrée vivent dans validator.py, le formatage d'affichage dans formatter.py. Avec les responsabilités réparties ainsi, les changements de formatage ne touchent que formatter.py — main.py et validator.py restent intacts.

main.py combine deux de tes propres modules
main.pyimport validatorimport formattervalidator.pyis_valid_price()formatter.pyformat_price()importimport
main.py importe deux modules avec import validator et import formatter, puis combine leurs fonctions pour faire un seul travail.

Remplis les fichiers joints validator.py et formatter.py, puis importe-les tous les deux depuis main.py.

① Dans validator.py, implémente is_valid_price(price) — retourne True si price est un int positif, False sinon.

② Dans formatter.py, implémente format_price(price) — prends un int, ajoute une majoration de 5 % avec int(price + price * 0.05), et retourne une chaîne comme "with tax: $1575".

③ Dans main.py, importe les deux. Décide si price = 1500 est valide, formate-le et affiche le résultat.

Éditeur Python

Exécuter le code pour voir le résultat

Cet article a couvert la hiérarchie module / package / bibliothèque, comment import récupère des fonctions depuis d'autres fichiers, ce qui s'exécute au moment de l'import, le motif __name__ == "__main__" pour distinguer exécution directe et import, et la répartition multi-modules où chaque fichier porte une seule responsabilité. Le prochain article creuse les packages et le fichier __init__.py.

QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quel mapping de module / package / bibliothèque est correct ?

Question 2math_utility.py contient print("hello") écrit au niveau supérieur. Qu'apparaît-il à l'écran quand un autre fichier fait import math_utility ?

Question 3Quel est le bon couplage pour exécution directe vs import de ce code ?
if __name__ == "__main__":
print("hello")