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
Соответствующие ссылки
Ответы
Ответ 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
.