ModuleNotFoundError при запуске отдельных файлов Python с абсолютным импортом

ModuleNotFoundError под управлением Python 3.8.x

Я создаю пакет python, содержащий классы и функции, каждая из которых содержит подробные тесты. Внутри пакета я пытаюсь использовать эти строительные блоки для обеспечения сквозного использования и примеров, используя абсолютный импорт в верхней части этих файлов (как в моих тестах).

Структура проекта следующая:

.
├── __init__.py
├── setup.py
├── examples
│   ├── __init__.py
│   └── end_to_end_1.py
├── tests
│   ├── __init__.py
│   └── utils
│       ├── __init__.py
│       ├── test_useful_one.py
│       └── test_useful_two.py
└── utils
    ├── __init__.py
    ├── useful_one.py
    └── useful_two.py

Я запускаю все тесты из корня пакета, используя python -m unittest tests/**/*.py, и оба тестовых файла содержат абсолютный импорт пакетов из utils, вот так,

from utils.useful_one import UsefulClass

этот подход позволяет запускать тесты и импортировать класс UsefulClass в тестовые файлы.

Моя проблема возникает при попытке использовать тот же оператор импорта внутри модуля examples/end_to_end_1.py и выполнении файла (снова из корня пакета) с использованием

python examples/end_to_end_1.py

Теперь получаю время выполнения ModuleNotFoundError: No module named 'utils'.

Пытаясь следовать руководящим принципам языка Python, я пытаюсь использовать абсолютный импорт, где это возможно, но безрезультатно.

Я определенно неправильно понял, как файлы __init__.py должны сообщать среде выполнения, откуда разрешать пакеты. Я не думаю, что этот вариант использования ненормален, поскольку я все время вижу один и тот же шаблон внутри пакетов узлов и рубиновых драгоценных камней.

Временное (временное) решение

На данный момент для решения этой проблемы я применил решение из Абсолютные результаты импорта в ModuleNotFoundError, которые несмотря на то, что он работает, кажется не слишком масштабируемым, когда репозиторий общедоступен, и я чувствую, что экосистема Python найдет решение для этой проблемы. Как говорит Раймонд Хеттингер, это похоже на ...

Должен быть способ получше!


person Joel Biffin    schedule 21.10.2020    source источник