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.pybenö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 baseim 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.pywürde aussehen wie:
from .base import BaseThing
Der führende .sagt "Import baseaus Modulverzeichnis"; mit anderen Worten, .baseKarten zu ./base.py.
In ähnlicher Weise gibt es ein ..Präfix, das die Verzeichnishierarchie wie folgt ../(mit ..modZuordnung 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.pybeziehen, 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 mathFunktionen 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))