Python. Как импортировать из соседнего каталога?

версия для печати
Python import

В Питоне отбитая система импорта, она может довести до истерики.

И хотя я новичок в этой теме, я все же хочу зафискировать (в первую очередь для себя) решения, которые я нашел и у меня они работают.

Вот есть такая иерархия скриптов:

|- reuse/
|  ├- __init__.py
|  └- notificators.py
|
|- sandbox/
|  ├- __init__.py
|  ├- connectors.py
|  └- wrapper.py
|
|- local_tests/
|  └- some.py
|
|- main.py
|- README.md

Не прикапывайтесь к организации каталогов, на практике она не существует. Примеры надуманные, только для демонстрации работы с импортами.

Сейчас неважно, как именно описаны __init__.py. Остановимся на том, что там как-то импорты объявлены. Питон видит каждый такой каталог, как пакет, из него можно что-то вызывать.

  • Если запускаемый скрипт, как минимум, на уровень выше импортируемых - все работает:
# main.py

from reuse import notify_slack

notify_slack('This is a test')
$ python main.py # Так работает
  • Если импорты между соседними каталогами, но при этом запускаемый скрипт - выше, тоже будет работать, только импорты нужно относительные описывать:
# wrapper.py

# Тут относительный путь до импортируемого компонента, который лежит в текущем каталоге
# в соседнем скрипте
from .connectors import clickhouse_client

# А тут относительный путь до компонента в соседнем каталоге
from ..reuse import notify_slack

def query():
    client = clickhouse_client()
    ...

def send(message):
    notify_slack(message)

Запускаемый скрипт:

# main.py

from sandbox.wrapper import send

send('This is a test')
  • Но если запускаемый скрипт и импортируемый - в соседних каталогах, то уже ни хрена без бубна не работает. Поэтому делаем так:

# some.py

# Важно! Тут абсолютный путь, несмотря на то, что каталоги - соседи. 
# С относительным не будет работать решение ниже.
from reuse import notify_slack

notify_slack('This is a test', True)

И вызываем как модуль:

$ python local_tests/some.py # Так не будет работать.

$ python -m local_tests.some # А так - будет.

Решение нашел тут. Но по уму решение куда сложнее - SoF. В основе этих решений лежит мат.часть, как именно Питон рулит импортами, но там настолько сложно все, что одной цитатой не обойтись.

[1oo%, EoF]

Понравилась статья? Расскажите о ней друзьям:

Метки: кодинг

Комментарии
Для работы модуля комментариев включите javaScript


Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Продвижение
Время
Метки