Решаем ImportError в PyTest: импорт модуля работает в Python
Быстрый ответ
Начнём с проверки, что pytest и Python используют одну и ту же среду. Сравните версии используемых интерпретаторов командами pytest --version
и python -m pytest --version
. Если версии различаются, нет единого окружения или пути (PATH
) отличаются – это может служить причиной ошибок. Для того чтобы показать pytest путь к модулю, воспользуйтесь следующей командой:
python -m pytest /path/to/your/module
Учтите, что для корректного определения пакетов файл __init__.py
должен быть в каждой папке. Убедитесь в отсутствии конфликтов с модулями стандартной библиотеки, чтобы избежать ошибок импорта.
Решения для типичных сценариев
1. Структура директорий и init.py
Соблюдение правильной структуры директорий крайне важно. Если у вас происходит неявный импорт модулей, проверьте наличие файла conftest.py
в корневой папке тестов. В некоторых ситуациях, наличие файла __init__.py
в директориях тестов поможет pytest разобраться со структурой путей.
2. Что скрывает sys.path
Для того чтобы убедиться, что Python обращается к модулям по корректным путям, в начале тестового файла выведите sys.path
:
# Ну-ка, Python, покажи нам свои карты!
import sys
print(sys.path)
Сравните результаты при выполнении команд через pytest и напрямую через python. Если обнаружены различия, настройте переменную среды PYTHONPATH
или используйте флаг --rootdir
для pytest.
3. Проверка виртуальной среды
При работе с виртуальной средой проверьте следующее:
- Является ли текущая среда активной?
- Установлен ли pytest внутри данной среды?
- Не произошел ли случайно запуск глобальной версии pytest?
4. Загадочный conftest.py
Файл conftest.py
определяет параметры тестового окружения. Убедитесь, что он настроен верно и не вводит pytest в заблуждение при разрешении импортов.
Визуализация
Библиотека Python (🐍): Находит книгу 'requests' на полке A
| Путь: 'lib/books/requests.py' |
Библиотека Pytest (🔍): Книгу 'requests' найти не может!
| Ожидаемый путь: 'tests/books/..' |
| Фактический путь: 'lib/books/requests.py' |
Поддерживайте одну и ту же логику в связях библиотек:
- В Python путь к библиотеке прямой и указывает на дом (🏠).
- В pytest путь похож на пазл (🧩), запутаться в котором легко без подробной карты.
Убедитесь, что у pytest есть подходящий conftest.py
или PYTHONPATH
, чтобы он мог определить правильный маршрут.
Дальнейшее расследование
1. Соблюдение корректности среды
Перед запуском pytest всегда активируйте среду командой source venv/bin/activate
. Это позволит исключить случайное использование системных версий Python и pytest. Для проверки используемых версий воспользуйтесь командами which python
и which pytest
.
2. Очистка кэшей путей
Кэши оболочки могут "запоминать" старые пути. Чтобы этого избежать, воспользуйтесь hash -r
или укажите полный путь к исполняемому файлу pytest.
3. Циклические импорты
Обратите внимание на циклические импорты, которые могут привести к ошибкам импорта, особенно во время сбора тестов pytest.
4. Файлы .pth: друг или враг?
Внимательно просмотрите настройки ваших файлов .pth
в папке site-packages. Они могут влиять на sys.path
, создавая корректные пути для Python и вызывая замешательство в pytest.
5. Абсолютные > относительные импорты
В тестах предпочтительнее использовать абсолютные импорты для избежания проблем, вызванных сложной структурой директорий.
Полезные материалы
- Описание механизмов импорта и работы с переменными sys.path/PYTHONPATH в pytest
- Использование Pipenv и организация виртуальных сред в Python
- Рекомендации по структурированию вашего проекта на Python
- Руководство по использованию фикстур pytest для настройки тестов
- Создание модулей и пакетов в Python
- Назначениe файлa init.py в пакетах Python
- Настройка файла конфигурации pytest.ini