Python >> Tutoriel Python >  >> Python

Python — Comment importer des modules depuis un autre dossier ?

La manière la plus Pythonic pour importer un module depuis un autre dossier est de placer un fichier vide nommé __init__.py dans ce dossier et utilisez le chemin relatif avec la notation par points .

Par exemple, un module dans le dossier parent serait importé avec from .. import module . Le __init__.py file signale à Python que le dossier doit être traité comme un package .

Formulation du problème

Problème :Comment importer un fichier ou un module depuis un autre dossier ou répertoire en Python ?

Exemple  :Supposons que vous ayez donné la structure de dossiers suivante :

application
 ├── app
 │   └── folder
 │       └── file_1.py
 └── app2
     └── some_folder
         └── file_2.py

Votre objectif est d'importer des fonctions de file_1.py en file_2.py .

Méthode 1 :sys.path.append()

La première méthode ajoute le chemin du file_1.py au path du système variable.

# file_2.py
import sys
sys.path.append('/.../application/app/folder')

import file_1

Notez que vous devez remplacer les trois premiers points dans '/.../application/app/folder' avec le chemin concret vers le applications dossier.

Au fait, n'hésitez pas à rejoindre mon académie de messagerie gratuite et à télécharger vos feuilles de triche Python ici :

C'est amusant - et des milliers de Finxters m'ont dit qu'ils adoraient les feuilles de triche !

Bon, passons à une solution légèrement modifiée à ce problème :

Méthode 2 :sys.path.insert()

Une alternative similaire consiste à insérer le chemin de file_1.py à la position 1 du path du système variable.

Cela garantit qu'il est chargé avec une priorité plus élevée et évite certains conflits de nom :

# file_2.py
import sys
sys.path.insert(1, '/.../application/app/folder')

import file

Encore une fois, remplacez les trois premiers points dans '/.../application/app/folder' avec le chemin concret vers le applications dossier.

Méthode 3 :Notation par points avec __init__.py

Vous pouvez également faire l'astuce suivante :créer un nouveau package.

# file_2.py
from application.app.folder.file_1 import func_name

Cependant, assurez-vous d'inclure un __init__.py vide fichier dans le répertoire.

Ce fichier indique à Python de traiter le répertoire comme un package. Je considère que c'est la manière la plus pythonique de résoudre ce problème.

Méthode 4 :Importlib

Une alternative pas si Pythonic - c'est plus maladroit et est basé sur des dépendances externes - serait d'utiliser le importlib module.

Voici un exemple :

import importlib.util as ilu

folder = '/.../application/app/folder'
file = 'file_2'

spec = ilu.spec_from_file_location(file, folder)
your_lib = ilu.module_from_spec(spec)
spec.loader.exec_module(your_lib)

your_lib.function()

Vidéo associée

N'hésitez pas à regarder la vidéo explicative suivante où Finxter Creator Peter vous montre comment appeler une fonction depuis un autre fichier :

Références

  • https://stackoverflow.com/questions/4383571/importing-files-from-different-folder
  • https://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path?rq=1
  • Comment importer une fonction Python depuis un autre dossier