310 Stimmen

Wie importiert man eine Python-Klasse, die sich in einem übergeordneten Verzeichnis 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?

245voto

gimel Punkte 78080

from ..subpkg2 import mod

Laut den Python-Dokumenten: Wenn Sie sich innerhalb einer Pakethierarchie befinden, verwenden Sie zwei Punkte, wie es im Import-Anweisungs-Dokument heißt:

Beim Angeben des zu importierenden Moduls müssen Sie nicht den absoluten Namen des Moduls angeben. Wenn ein Modul oder Paket in einem anderen Paket enthalten ist, ist es möglich, einen relativen Import innerhalb desselben obersten Pakets ohne Angabe des Paketnamens vorzunehmen. Durch Verwenden von führenden Punkten im angegebenen Modul oder Paket nach from können Sie angeben, wie hoch in der aktuellen Pakethierarchie navigiert werden soll, ohne genaue Namen anzugeben. Ein führender Punkt bedeutet das aktuelle Paket, in dem das Modul importiert wird. Zwei Punkte bedeuten einen Paketebene höher. Drei Punkte sind zwei Ebenen höher usw. Wenn Sie also from . import mod in einem Modul im Paket pkg ausführen, werden Sie pkg.mod importieren. Wenn Sie from ..subpkg2 import mod innerhalb von pkg.subpkg1 ausführen, importieren Sie pkg.subpkg2.mod. Die Spezifikation für relative Imports ist in PEP 328 enthalten.

PEP 328 behandelt absolute/relative Imports.

197voto

Sepero Punkte 4025
import sys
sys.path.append("..") # Fügt übergeordnetes Verzeichnis zum Python-Modulpfad hinzu.

102voto

Alex Martelli Punkte 805329

Die Antwort von @gimel ist korrekt wenn Sie die Pakethierarchie garantieren können, die er erwähnt. Wenn nicht -- wenn Ihr tatsächlicher Bedarf so ist, wie Sie es ausgedrückt haben, ausschließlich an Verzeichnisse gebunden und ohne jegliche notwendige Beziehung zur Paketierung -- dann müssen Sie an __file__ arbeiten, um das übergeordnete Verzeichnis zu finden (ein paar Aufrufe von os.path.dirname werden ausreichen ;-) , dann (wenn dieses Verzeichnis noch nicht in sys.path enthalten ist) vorübergehend dieses Verzeichnis am Anfang von sys.path einfügen, __import__ , das genannte Verzeichnis wieder entfernen -- chaotische Arbeit, aber, "wenn es sein muss, dann muss es sein" (und Pyhon bemüht sich, den Programmierer nie davon abzuhalten, das zu tun, was erledigt werden muss - genau wie es im Abschnitt "Geist von C" im Vorwort des ISO C-Standards steht!).

Hier ist ein Beispiel, das für Sie funktionieren 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

31voto

Sepero Punkte 4025

Importiere ein Modul aus einem Verzeichnis, das genau ein Level über dem aktuellen Verzeichnis liegt:

from .. import module

6voto

JDG Punkte 387

Hier ist eine etwas minimalistische Dreischrittversion von ThorSummoner's Antwort für die Klarheit. Es macht nicht ganz das, was ich will (ich erkläre es unten), aber es funktioniert ganz gut.

Schritt 1: Ordner und setup.py erstellen

pfad_zu/projekt_name/
    setup.py

In setup.py schreiben:

import setuptools

setuptools.setup(name='project_name')

Schritt 2: Diesen Ordner als Paket installieren

Führen Sie diesen Code in der Konsole aus:

python -m pip install --editable pfad_zu/projekt_name

Statt python müssen Sie möglicherweise python3 oder ähnliches verwenden, je nachdem, wie Ihr Python installiert ist. Außerdem können Sie anstelle von --editable auch -e verwenden.

Jetzt sieht Ihr Ordner mehr oder weniger so aus. Ich weiß nicht, was es mit den Egg-Dingen auf sich hat.

pfad_zu/projekt_name/
    setup.py
    test_3.egg-info/
        dependency_links.txt
        PKG-INFO
        SOURCES.txt
        top_level.txt

Dieser Ordner wird als Python-Paket betrachtet und Sie können aus Dateien in diesem übergeordneten Verzeichnis importieren, selbst wenn Sie anderswo auf Ihrem Computer ein Skript schreiben.

Schritt 3. Aus dem obigen importieren

Angenommen, Sie erstellen zwei Dateien, eine im Hauptverzeichnis Ihres Projekts und eine in einem Unterverzeichnis. Es wird so aussehen:

pfad_zu/projekt_name/
    top_level_file.py
    unterverzeichnis/
        subfile.py

    setup.py          |
    test_3.egg-info/  |----- Ignorieren Sie diese Jungs
        ...           |

Jetzt, wenn top_level_file.py so aussieht:

x = 1

Dann kann ich es aus subfile.py importieren, oder wirklich aus jeder anderen Datei an einem beliebigen Ort auf Ihrem Computer.

# subfile.py  ODER  some_other_python_file_somewhere_else.py

import random # Dies ist ein Standardpaket, das überall importiert werden kann.
import top_level_file # Jetzt funktioniert top_level_file.py ähnlich.

print(top_level_file.x)

Das unterscheidet sich von dem, was ich gesucht habe: Ich hatte gehofft, dass Python eine Möglichkeit hat, aus einer übergeordneten Datei importieren zu können. Stattdessen muss ich das Skript wie ein Modul behandeln, eine Menge Boilerplate machen und es global installieren, damit die gesamte Python-Installation darauf zugreifen kann. Das ist übertrieben. Wenn jemand eine einfachere Methode hat, die nicht den obigen Prozess oder importlib-Spielereien beinhaltet, lass es mich bitte wissen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X