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?
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?
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 alsofrom . import mod
in einem Modul im Paketpkg
ausführen, werden Siepkg.mod
importieren. Wenn Siefrom ..subpkg2 import mod
innerhalb vonpkg.subpkg1
ausführen, importieren Siepkg.subpkg2.mod
. Die Spezifikation für relative Imports ist in PEP 328 enthalten.
PEP 328 behandelt absolute/relative Imports.
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
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.
setup.py
erstellenpfad_zu/projekt_name/
setup.py
In setup.py
schreiben:
import setuptools
setuptools.setup(name='project_name')
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.
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 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.