Относительный импорт происходит всякий раз, когда вы импортируете пакет относительно текущего скрипта / пакета.
Рассмотрим, например, следующее дерево:
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))
Для поддержки Python 2 и Python 3 используйте явный относительный импорт, как показано ниже. Они относительно текущего модуля. Они поддерживаются начиная с 2.5 .
источник
import .brother
неверный синтаксис для Python 2 и 3import ..uncle
. Исправлена. О чем я думал ... вероятно, отвлекся на рыцарей, которые говорят Ni!В ответ Михаила Гурни добавлен еще один случай:
Обратите внимание, что относительный импорт основан на имени текущего модуля. Поскольку имя основного модуля всегда "
__main__
", модули, предназначенные для использования в качестве основного модуля приложения Python, всегда должны использовать абсолютный импорт.источник