Python. Как импортировать из соседнего каталога?
версия для печати
В Питоне отбитая система импорта, она может довести до истерики. И хотя я новичок в этой теме, я все же хочу зафискировать (в первую очередь для себя) решения, которые я нашел и у меня они работают. |
Вот есть такая иерархия скриптов:
|- 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]Понравилась статья? Расскажите о ней друзьям: