Python: импортировать содержащий пакет
В модуле, находящемся внутри пакета, у меня есть необходимость использовать функцию, определенную в __init__.py
этого пакета. как я могу импортировать пакет внутри модуля, который находится внутри пакета, поэтому я могу использовать эту функцию?
Импорт __init__
внутри модуля не будет импортировать пакет, а вместо него - модуль с именем __init__
, что приведет к двум копиям вещей с разными именами...
Есть ли питонический способ сделать это?
Ответы
Ответ 1
Кроме того, начиная с Python 2.5, возможен относительный импорт. например:.
from . import foo
Цитата из http://docs.python.org/tutorial/modules.html#intra-package-references:
Начиная с Python 2.5, в дополнение к неявным относительным импортам, описанным выше, вы можете написать явные относительные импорты с формой импорта импорта из формы импорта. Эти явные относительные импорты используют ведущие точки для указания текущих и родительских пакетов, участвующих в относительном импорте. Например, из окружающего модуля вы можете использовать:
from . import echo
from .. import formats
from ..filters import equalizer
Ответ 2
Это точно не отвечает на ваш вопрос, но я предлагаю вам переместить функцию вне файла __init__.py
и в другой модуль внутри этого пакета. Затем вы можете легко импортировать эту функцию в свой другой модуль. Если вы хотите, вы можете иметь оператор импорта в файле __init__.py
, который будет импортировать эту функцию (при импорте пакета).
Ответ 3
Если пакет имеет имя testmod
, поэтому ваш файл инициализации testmod/__init__.py
, а ваш модуль в пакете submod.py
, а затем из submod.py
файла, вы должны просто сказать import testmod
и использовать независимо от того, что вы хотите, что определено в testmod.
Ответ 4
В Django файл manage.py имеет from django.core.management import execute_manager
, но execute_manager
не является модулем. Это функция в модуле __init__.py
каталога management
.
Ответ 5
Я не совсем уверен, что это такое, но это может решить вашу проблему "другого имени":
import __init__ as top
top.some_function()
Или возможно?:
from __init__ import some_function
some_function()