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
а затем сделать
some_app $ python out.py
работает отлично.
Следовательно, то, что происходит, - это. Я загружаю пакет в модуль, который находится в том же пакете, а затем запускаю этот модуль как __main__
файл - и это не работает. Далее я загружаю тот же модуль (тот, который я запускал как __main__
) внутри другого модуля, а затем запустите этот другой модуль как __main__
- и это работает.
Может кто-нибудь рассказать, что здесь происходит?
ОБНОВИТЬ
Я понимаю, что нет прямой причины для этого - потому что я мог бы напрямую импортировать любые модули внутри some_app
пакет. Я пытаюсь это сделать потому, что в проекте Django это то, что они делают. Смотрите этот файл для примера
В каждом модуле все нестандартные операции импорта начинаются с django.
, Поэтому я удивился, почему и как они это делают.
ОБНОВЛЕНИЕ 2
Соответствующие ссылки
3 ответа
mod2.py
это часть some_app
, Таким образом, нет смысла импортировать модуль, поскольку вы уже внутри него.
Вы все еще можете import mod1
, Я предполагаю, что вам нужно some_app/__init__.py
бежать. Не уверен, что это возможно.
РЕДАКТИРОВАТЬ:
Похоже from . import some_module
будет делать то, что вы после.
Ты можешь сделать import some_app.mod2
от out.py
потому что он находится в том же каталоге, что у вас есть some_app
пакет, и интерпретатор Python начинает искать модули с этого пути.
Ошибка импорта в mod2.py
это нормально, потому что нет some_app
пакет в mod2.py
папка.
Кажется, "from . Import some_module" работает только в Python3.
Универсальный способ - выполнить весь импорт в init.py.