web-dev-qa-db-fra.com

Comment importer une classe Python qui se trouve dans un répertoire ci-dessus?

Je veux hériter d'une classe dans un fichier qui se trouve dans un répertoire au-dessus du répertoire actuel.

Est-il possible d'importer relativement ce fichier?

169
user129975

Dans une hiérarchie de paquets, utilisez deux points, comme le instruction d'importation doc dit:

Lors de la spécification du module à importer, il n'est pas nécessaire de spécifier le nom absolu du module. Lorsqu'un module ou un package est contenu dans un autre package, il est possible d'effectuer une importation relative dans le même package sans avoir à mentionner le nom du package. En utilisant des points de repère dans le module ou le package spécifié après from, vous pouvez spécifier la hauteur à parcourir dans la hiérarchie du package en cours sans spécifier de noms exacts. Un point en tête signifie le package actuel dans lequel le module effectuant l'importation existe. Deux points correspondent à un niveau de package . Trois points représentent deux niveaux, etc. Ainsi, si vous exécutez from . import mod à partir d'un module du package pkg, vous finirez par importer pkg.mod. Si vous exécutez from ..subpkg2 import mod à partir de pkg.subpkg1, vous importerez pkg.subpkg2.mod. La spécification pour les importations relatives est comprise entre PEP 328 .

PEP 328 traite des importations absolues/relatives.

160
gimel
import sys
sys.path.append("..") # Adds higher directory to python modules path.
94
Sepero

La réponse de @ gimel est correcte si vous pouvez garantir la hiérarchie de paquets qu'il mentionne. Si vous ne pouvez pas - si votre besoin réel est tel que vous l'avez exprimé, lié exclusivement à des répertoires et sans aucune relation nécessaire avec l'empaquetage - vous devez alors travailler sur __file__ pour trouver le répertoire parent (quelques des appels de os.path.dirname suffiront ;-), alors (si ce répertoire n’est pas déjà sur sys.path), insérez temporairement ledit répertoire au tout début de sys.path, __import__, Enlevez à nouveau le répertoire - travail en désordre en effet, mais "quand vous devez, vous devez" (et Pyhon s'efforce de ne jamais empêcher le programmeur de faire ce que doit être fait - tout comme le standard ISO C dit dans la section "Esprit de C" dans sa préface! -).

Voici un exemple qui peut fonctionner pour vous:

import sys
import os.path
sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))

import module_in_parent_dir
70
Alex Martelli

Importer un module depuis un répertoire situé exactement un niveau au-dessus du répertoire actuel:

from .. import module
31
Sepero