Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
07 Июл 2023
2 мин
1279

Ошибка «попытка относительного импорта за пределами пакета верхнего уровня» в Python

Вводная Программирование на Python включает в себя работу с модулями и пакетами. Они помогают структурировать код и делают его более читаемым и понятным.

Вводная

Программирование на Python включает в себя работу с модулями и пакетами. Они помогают структурировать код и делают его более читаемым и понятным. Однако, новички часто сталкиваются с ошибкой «attempted relative import beyond top-level package», что в переводе означает «попытка относительного импорта за пределами пакета верхнего уровня».

Пример ошибки и причина ее возникновения

Рассмотрим простой пример структуры пакета:

package/
   __init__.py
   A/
      __init__.py
      foo.py
   test_A/
      __init__.py
      test.py

В файле test.py есть следующая строка кода:

from ..A import foo

При попытке запуска этого кода из папки package с помощью команды python -m test_A.test возникает ошибка «попытка относительного импорта за пределами пакета верхнего уровня». Однако, если запустить тот же код из родительской директории пакета package, ошибки не будет.

Причина этого в том, что Python считает текущую директорию верхним уровнем пакета. То есть при запуске из папки package, Python считает, что test_A — это пакет верхнего уровня, и попытка импорта из ..A выходит за его пределы, что вызывает ошибку.

Решение проблемы

Чтобы избежать этой ошибки, рекомендуется запускать код из родительской директории пакета. В данном примере, вместо команды python -m test_A.test следует использовать команду python -m package.test_A.test, запущенную из родительской директории для package.

Заключение

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

Добавить комментарий

Подарок
Забрать подарок