Дерево файлов :
/path/to/project/root/
├── .git/
├── Pipfile
├── Pipfile.lock
├── __init__.py
└── package1
├── __init__.py
├── src
│ ├── __init__.py
│ ├── external_lib
│ └── packageX
│ ├── packageY
│ └── packageZ
│ ├── foo.py
│ ├── bar.py
Ограничения:
foo.py
импорт bar.py
- и
foo.py
, и bar.py
импортируют некоторые файлы из external_lib/packageX/packageZ
- файлов в
external_lib/packageX/packageZ
, требующих packageX
и packageY
для включения в PYTHONPATH
для их собственных включений. - У меня нет ни одной точки входа: иногда я хочу запустить
foo.py
, иногда bar.py
. - external_lib является внешним, это подмодуль git.Я не хочу изменять его содержимое.
- Это общий проект, я хотел бы получить решение, которое включено в репозиторий git ...
ЧтоЯ делаю прямо сейчас
Я следую совету, данному здесь (хотя по-французски), который утверждает, что это хорошая практика:
- Перед запуском любого скрипта я запускаю
cd package1/src/external_lib/packageX; export PYTHONPATH=$PYTHONPATH:
pwd :
pwd /packageY; cd ../../../..
- Весь мой импорт записывается так:
import package1.src.bar
, import package1.src.external_lib.packageX.packageZ.some_module
- Я всегда вызываю всескрипты из корня проекта.
Это дает что-то вроде этого:
cd /path/to/project/root/
pipenv shell
cd package1/src/external_lib/packageX; export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/packageY; cd ../../../..
python package1/src/foo.py
python package1/src/bar.py
Вопрос
Какова лучшая практика, вс точки зрения архитектуры проекта, использования Pipenv, написания импорта и т. д. для плавного управления всем импортом с минимальным количеством ручных действий и ограничений (таких как export PYTHONPATH=...
команды перед запуском сценариев и запуском сценариев из корня), всамый питонский и пипенвский путь?
В идеале я бы хотел, чтобы Pycharm мог правильно получать весь импорт без дополнительных ручных настроек, чтобы то, что я делаю в Pycharm, отражало то, что происходило бы с терминалом.
Одним из возможных решений, которое я видел, является использование файла .env
Pipenv, добавление в него export PYTHONPATH=...
и его автоматическая загрузка .Однако, по-видимому, этот файл не предназначен для этого и не должен передаваться .