web-dev-qa-db-ger.com

Wie importiere ich eine Python Klasse, die sich in einem Verzeichnis darüber befindet?

Ich möchte von einer Klasse in einer Datei erben, die sich in einem Verzeichnis über dem aktuellen befindet.

Ist es möglich, diese Datei relativ zu importieren?

169
user129975

Verwenden Sie in einer Pakethierarchie zwei Punkte, wie in der Importanweisung doc angegeben:

Wenn Sie angeben, welches Modul importiert werden soll, müssen Sie nicht den absoluten Namen des Moduls angeben. Wenn ein Modul oder Paket in einem anderen Paket enthalten ist, kann ein relativer Import innerhalb desselben obersten Pakets durchgeführt werden, ohne dass der Paketname angegeben werden muss. Indem Sie führende Punkte in dem angegebenen Modul oder Paket nach from verwenden, können Sie angeben, wie hoch die aktuelle Pakethierarchie durchlaufen werden soll, ohne genaue Namen anzugeben. Ein führender Punkt steht für das aktuelle Paket, in dem sich das Modul befindet, das den Import ausführt. Zwei Punkte bedeuten eine Paketstufe höher . Drei Punkte sind zwei Ebenen höher usw. Wenn Sie also from . import mod Aus einem Modul im Paket pkg ausführen, werden Sie am Ende pkg.mod Importieren. Wenn Sie from ..subpkg2 import mod Aus pkg.subpkg1 Heraus ausführen, importieren Sie pkg.subpkg2.mod. Die Spezifikation für relative Importe ist in PEP 328 enthalten.

PEP 328 behandelt absolute/relative Importe.

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

Die Antwort von @gimel ist richtig , wenn Sie die von ihm erwähnte Pakethierarchie garantieren können. Wenn Sie dies nicht können - wenn Ihr wirkliches Bedürfnis so ist, wie Sie es ausgedrückt haben, ausschließlich an Verzeichnisse gebunden und ohne die notwendige Beziehung zur Verpackung -, müssen Sie an __file__ arbeiten, um das übergeordnete Verzeichnis (ein paar) herauszufinden von os.path.dirname Aufrufen reicht aus ;-), dann (falls dieses Verzeichnis nicht bereits in sys.path vorhanden ist) fügen Sie das Verzeichnis vorübergehend ganz am Anfang von sys.path, __import__ ein. besagtes Verzeichnis wieder entfernen - in der Tat eine unordentliche Arbeit, aber "wenn du musst, musst du" (und Pyhon bemüht sich, den Programmierer niemals davon abzuhalten, das zu tun, was muss getan werden soll - genau wie die ISO C-Standard sagt im Abschnitt "Spirit of C" in seinem Vorwort! -).

Hier ist ein Beispiel, das für Sie arbeiten könnte:

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

Importieren Sie das Modul aus einem Verzeichnis, das genau eine Ebene über dem aktuellen Verzeichnis liegt:

from .. import module
31
Sepero