Importer des packages Python depuis des sous répertoires

Apprenez à importer une librairie depuis un répertoire parent en Python grâce à un snippet pratique pour structurer efficacement vos projets.
Lorsque vous travaillez dans un projet avec une arboresence comme celle-ci:
.
├── libs
│ ├── get_content.py
│ └── get_key.py
└── tests
└── test_get_key.py
Pour importer les libs de depuis le répertoire test, cela peut s'avérer un peu tricky. Mais voici comment procéder depuis notre fichier test_get_key.py:
import os
import sys
# nous allons demander à Python de prendre aussi en considération les répertoires à partir du répertoire parent.
parent_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')
sys.path.append(parent_dir)
# maintenant il est possible d'importer facilement toutes les libs du répertoire parent.
from libs.get_key import read_key
Rien ne vous empêche de spécifier des chemins plus complexe et de les importer.
FAQ
Pourquoi Python ne trouve-t-il pas mes modules dans un répertoire parent par défaut ?
Python ne cherche les modules que dans les répertoires définis dans sys.path, qui inclut le répertoire du script en cours mais pas ses parents. Il faut donc ajouter manuellement le chemin souhaité à sys.path avant de tenter l'import.
Est-ce que cette méthode fonctionne quel que soit l'endroit où on exécute le script ?
Oui, car os.path.abspath(file) retourne le chemin absolu du fichier en cours d'exécution, indépendamment du répertoire depuis lequel vous lancez la commande Python.
Peut-on utiliser cette approche pour accéder à des répertoires encore plus profonds dans l'arborescence ?
Tout à fait, il suffit d'adapter le chemin passé à os.path.join en ajoutant autant de segments que nécessaire pour pointer vers le bon répertoire.
Y a-t-il une alternative plus propre à la modification de sys.path ?
Oui, utiliser un fichier init.py dans chaque répertoire et structurer le projet comme un package Python installable via pip ou pyproject.toml est une approche plus robuste pour les projets de grande taille.

Alexandre P.
Développeur passionné depuis plus de 20 ans, j'ai une appétence particulière pour les défis techniques et changer de technologie ne me fait pas froid aux yeux.
Poursuivre la lecture


