Подтвердить что ты не робот

Python - импортировать пакет в модуль, находящийся внутри одного пакета

У меня есть структура проекта что-то вроде этого...

/some_app
    build/
    README
    out.py
    some_app/
        __init__.py
        mod1.py
        mod2.py

Теперь я хочу импортировать пакет some_app в mod2, не входя в трюк sys.path. Я просто сделал это...

# mod2.py
import some_app

Теперь, когда я запускаю mod2.py из командной строки

some_app $ python mod2.py

он выдает ошибку ImportError: No module named some_app

НО, внутри файла out.py, когда я делаю

# out.py
import some_app.mod2

а затем do

some_app $ python out.py

он работает отлично.

Следовательно, это происходит. Я загружаю пакет в модуль, находящийся в одном пакете, а затем запускаю этот модуль как файл __main__, и он не работает. Затем я загружаю тот же модуль (тот, который я запускал как __main__) внутри другого модуля, а затем запускаю этот другой модуль как __main__ - и он работает.

Может кто-нибудь прокомментировать, что происходит здесь?

UPDATE

Я понимаю, что для этого нет прямой причины - потому что я мог напрямую импортировать любые модули внутри пакета some_app. Причина, по которой я пытаюсь это сделать, заключается в том, что в проекте Django это то, что они делают. См. этот файл, например

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

ОБНОВЛЕНИЕ 2

Соответствующие ссылки

4b9b3361

Ответ 1

mod2.py является частью some_app. Таким образом, нет смысла импортировать модуль, поскольку вы уже в нем.

Вы все еще можете import mod1. Я предполагаю, что вам нужно some_app/__init__.py для запуска. Не уверен, что это возможно.


EDIT:

Похоже, from . import some_module будет делать то, что вам нужно.

Ответ 2

Вы можете сделать import some_app.mod2 из out.py, потому что он находится в том же каталоге, что у вас есть пакет some_app, а интерпретатор Python начинает искать модули с этого пути.

Ошибка импорта в mod2.py является нормальной, поскольку в папке mod2.py не существует пакета some_app.