Ответ 1
Относительный импорт происходит всякий раз, когда вы импортируете пакет относительно текущего пакета script/.
Рассмотрим следующее дерево, например:
mypkg
├── base.py
└── derived.py
Теперь ваш derived.py
требует что-то от base.py
. В Python 2 вы можете сделать это так (в derived.py
):
from base import BaseThing
Python 3 больше не поддерживает это, поскольку он не является явным, хотите ли вы "относительный" или "абсолютный" base
. Другими словами, если в системе был установлен пакет Python с именем base
, вы ошиблись.
Вместо этого он требует использования явного импорта, в котором явно указывается расположение модуля по пути. Ваш derived.py
будет выглядеть так:
from .base import BaseThing
Ведущий .
говорит 'import 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))