Как обрабатывать "плоский" относительный импорт в 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
потому что он может содержать вещи, которые вы не хотите импортировать).