Der relative Import erfolgt immer dann, wenn Sie ein Paket relativ zum aktuellen Skript / Paket importieren.
Betrachten Sie zum Beispiel den folgenden Baum:
mypkg
├── base.py
└── derived.py
Nun, Sie derived.py
benötigen etwas von base.py
. In Python 2 können Sie dies folgendermaßen tun derived.py
:
from base import BaseThing
Python 3 unterstützt dies nicht mehr, da nicht explizit angegeben ist, ob Sie "relativ" oder "absolut" möchten base
. Mit anderen Worten, wenn ein Python-Paket mit dem Namen base
im System installiert wäre, würden Sie das falsche erhalten.
Stattdessen müssen Sie explizite Importe verwenden, die den Speicherort eines Moduls auf pfadähnlicher Basis explizit angeben. Ihr derived.py
würde aussehen wie:
from .base import BaseThing
Der führende .
sagt "Import base
aus Modulverzeichnis"; mit anderen Worten, .base
Karten zu ./base.py
.
In ähnlicher Weise gibt es ein ..
Präfix, das die Verzeichnishierarchie wie folgt ../
(mit ..mod
Zuordnung zu ../mod.py
) und dann ...
zwei Ebenen höher ( ../../mod.py
) und so weiter.
Beachten Sie jedoch, dass sich die oben aufgeführten relativen Pfade auf das Verzeichnis derived.py
beziehen, in dem sich das aktuelle Modul ( ) befindet, nicht auf das aktuelle Arbeitsverzeichnis.
@BrenBarn hat den Fall des Sternimports bereits erklärt. Der Vollständigkeit halber muss ich dasselbe sagen;).
Zum Beispiel müssen Sie einige math
Funktionen verwenden, aber Sie verwenden sie nur in einer einzigen Funktion. In Python 2 durften Sie halb faul sein:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Beachten Sie, dass in Python 2 bereits eine Warnung ausgelöst wird:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
Im modernen Python 2-Code sollten Sie und in Python 3 müssen Sie entweder Folgendes tun:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
oder:
from math import *
def sin_degrees(x):
return sin(degrees(x))
Verwenden Sie die folgenden expliziten relativen Importe, um sowohl Python 2 als auch Python 3 zu unterstützen. Sie beziehen sich auf das aktuelle Modul. Sie wurden ab 2.5 unterstützt .
quelle
import .brother
ist ungültige Syntax für Python 2 und 3import ..uncle
. Fest. Oh, was habe ich gedacht ... wurde wahrscheinlich von den Rittern abgelenkt, die Ni sagen!Der Antwort von Michał Górny wurde ein weiterer Fall hinzugefügt:
Beachten Sie, dass relative Importe auf dem Namen des aktuellen Moduls basieren. Da der Name des Hauptmoduls immer "
__main__
" lautet , müssen Module, die als Hauptmodul einer Python-Anwendung verwendet werden sollen, immer absolute Importe verwenden.quelle