Относительный импорт происходит всякий раз, когда вы импортируете пакет относительно текущего скрипта / пакета.
Рассмотрим, например, следующее дерево:
mypkg
├── base.py
└── derived.py
Теперь ваш derived.pyтребует чего-то от base.py. В Python 2 вы можете сделать это следующим образом (в derived.py):
from base import BaseThing
Python 3 больше не поддерживает это, поскольку неясно, хотите ли вы «относительный» или «абсолютный» base. Другими словами, если baseв системе установлен пакет Python с именем , вы получите неправильный.
Вместо этого он требует использования явных импортов, которые явно указывают местоположение модуля на основе пути. Ваш derived.pyбудет выглядеть так:
from .base import BaseThing
Ведущий .говорит «импорт baseиз каталога модулей»; другими словами, .baseкарты для ./base.py.
Точно так же есть ..префикс, который идет вверх по иерархии каталогов, например ../(с ..modотображением на ../mod.py), а затем ...идет на два уровня вверх ( ../../mod.py) и так далее.
Однако обратите внимание, что перечисленные выше относительные пути относились к каталогу, в котором находится текущий модуль ( derived.py), а не к текущему рабочему каталогу.
@BrenBarn уже объяснил случай импорта звезд. Для полноты мне придется сказать то же самое;).
Например, вам нужно использовать несколько mathфункций, но вы используете их только в одной функции. В Python 2 вам было позволено быть ленивым:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Обратите внимание, что это уже вызывает предупреждение в Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
В современном коде Python 2 вы должны, а в Python 3 вы должны сделать либо:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
или:
from math import *
def sin_degrees(x):
return sin(degrees(x))