Решаем ImportError в PyTest: импорт модуля работает в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Начнём с проверки, что pytest и Python используют одну и ту же среду. Сравните версии используемых интерпретаторов командами pytest --version и python -m pytest --version. Если версии различаются, нет единого окружения или пути (PATH) отличаются – это может служить причиной ошибок. Для того чтобы показать pytest путь к модулю, воспользуйтесь следующей командой:

Python
Скопировать код
python -m pytest /path/to/your/module

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

Кинга Идем в IT: пошаговый план для смены профессии

Решения для типичных сценариев

1. Структура директорий и init.py

Соблюдение правильной структуры директорий крайне важно. Если у вас происходит неявный импорт модулей, проверьте наличие файла conftest.py в корневой папке тестов. В некоторых ситуациях, наличие файла __init__.py в директориях тестов поможет pytest разобраться со структурой путей.

2. Что скрывает sys.path

Для того чтобы убедиться, что Python обращается к модулям по корректным путям, в начале тестового файла выведите sys.path:

Python
Скопировать код
# Ну-ка, Python, покажи нам свои карты!
import sys
print(sys.path)

Сравните результаты при выполнении команд через pytest и напрямую через python. Если обнаружены различия, настройте переменную среды PYTHONPATH или используйте флаг --rootdir для pytest.

3. Проверка виртуальной среды

При работе с виртуальной средой проверьте следующее:

  • Является ли текущая среда активной?
  • Установлен ли pytest внутри данной среды?
  • Не произошел ли случайно запуск глобальной версии pytest?

4. Загадочный conftest.py

Файл conftest.py определяет параметры тестового окружения. Убедитесь, что он настроен верно и не вводит pytest в заблуждение при разрешении импортов.

Визуализация

Markdown
Скопировать код
Библиотека Python (🐍): Находит книгу 'requests' на полке A
| Путь: 'lib/books/requests.py' |

Библиотека Pytest (🔍): Книгу 'requests' найти не может!
| Ожидаемый путь: 'tests/books/..' |
| Фактический путь: 'lib/books/requests.py' |

Поддерживайте одну и ту же логику в связях библиотек:

Markdown
Скопировать код
- В 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. Абсолютные > относительные импорты

В тестах предпочтительнее использовать абсолютные импорты для избежания проблем, вызванных сложной структурой директорий.

Полезные материалы

  1. Описание механизмов импорта и работы с переменными sys.path/PYTHONPATH в pytest
  2. Использование Pipenv и организация виртуальных сред в Python
  3. Рекомендации по структурированию вашего проекта на Python
  4. Руководство по использованию фикстур pytest для настройки тестов
  5. Создание модулей и пакетов в Python
  6. Назначениe файлa init.py в пакетах Python
  7. Настройка файла конфигурации pytest.ini