Обработка импорта и Pythonpath с помощью Pipenv - PullRequest
0 голосов
/ 05 декабря 2018

Дерево файлов :

/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=... и его автоматическая загрузка .Однако, по-видимому, этот файл не предназначен для этого и не должен передаваться .

...