Как обрабатывать "плоский" относительный импорт в Python 3.6?

Поскольку вопросов об относительном импорте очень много, я сделаю его максимально коротким и приятным. И да, я прочитал " Относительный импорт в миллиардный раз".

У меня есть такая структура проекта:

.
├── Makefile
└── src
    ├── __init__.py
    ├── model
    │   └── train_model.py
    └── preprocessing
        └── process.py

где я хочу иметь возможность, например, позвонить make preprocessingили же make train который затем работает либо process.pyили же train_model.py с

## Make train
train:
    python3 src/model/train_model.py

Например, модули всегда будут в верхней папке проекта, где живет Makefile.

Теперь моя проблема в том, что у меня могут быть зависимости между различными подмодулями, такими как train_model.py а также process.py, В частности, если я пытаюсь импортировать processв train_model используя from src.preprocessing import process я получаю ошибку ImportError: No module named 'src', В том же духе я пробовал from ...preprocessing import process, что дает мне еще одну ошибку: SystemError: Parent module '' not loaded, cannot perform relative import,

я использую if __name__ == '__main__': в конце моего train_model.py, но я не могу понять, как Python использует __name__чтобы найти разные модули, и если это f**** что-то в процессе.

1 ответ

Решение

Использование PYTHONPATH, Я бы сделал это так:

Makefile:

export PYTHONPATH=$(abspath src)

train:
    python3 src/model/train_model.py

train_model.py:

from preprocessing import process

Теперь каждый импорт будет сначала выглядеть под src, Не принято писать from src.preprocessing import process - обычно считается, что импорт находится в некотором базовом каталоге (вы не хотите устанавливать PYTHONPATH в каталог выше srcпотому что он может содержать вещи, которые вы не хотите импортировать).

Другие вопросы по тегам