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 найдет решение для этой проблемы. Как говорит Раймонд Хеттингер, это похоже на ...
Должен быть способ получше!