Выбор ответа Middle Модули, пакеты и окружения обновлено

Относительный импорт при прямом запуске

Вопрос

Файл app/services/report.py содержит from .db import query. Запуск python app/services/report.py падает с ImportError: attempted relative import with no known parent package. Как запустить правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: python -m app.services.report из корня проекта. При запуске файлом модуль получает имя main без пакета, и относительному импорту не от чего отсчитывать. python -m app.services.report загружает модуль как часть пакета, и .db разрешается в app.services.db.

Варианты ответа

  1. Добавить __init__.py в корень диска
  2. python -m app.services.report из корня проектаправильный ответ
  3. Заменить точку на две точки: from ..db
  4. Запустить с sudo, чтобы был доступ к пакету

Разбор

При запуске файлом модуль получает имя __main__ без пакета, и относительному импорту не от чего отсчитывать. python -m app.services.report загружает модуль как часть пакета, и .db разрешается в app.services.db. Две точки только поднимут уровень выше, права доступа тут ни при чём.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме