Python: импортировать содержащий пакет - PullRequest
57 голосов
/ 12 января 2009

В модуле, находящемся внутри пакета, мне нужно использовать функцию, определенную в __init__.py этого пакета. Как я могу импортировать пакет в модуль, который находится в пакете, чтобы я мог использовать эту функцию?

Импорт __init__ внутри модуля не будет импортировать пакет, а вместо этого будет иметь модуль с именем __init__, что приведет к двум копиям вещей с разными именами ...

Есть ли питонский способ сделать это?

Ответы [ 5 ]

43 голосов
/ 12 января 2009

Также, начиная с Python 2.5, возможен относительный импорт. e.g.:

from . import foo

Цитата из http://docs.python.org/tutorial/modules.html#intra-package-references:


Начиная с Python 2.5, в дополнение к неявному относительному импорту, описанному выше, вы можете написать явный относительный импорт в форме имени импорта из оператора оператора import. Этот явный относительный импорт использует начальные точки для обозначения текущего и родительского пакетов, участвующих в относительном импорте. Например, из окружающего модуля вы можете использовать:

from . import echo
from .. import formats
from ..filters import equalizer
23 голосов
/ 12 января 2009

Это не совсем отвечает на ваш вопрос, но я собираюсь предложить вам переместить функцию за пределы файла __init__.py и в другой модуль внутри этого пакета. Затем вы можете легко импортировать эту функцию в ваш другой модуль. Если вы хотите, вы можете иметь оператор импорта в файле __init__.py, который будет импортировать и эту функцию (при импорте пакета).

5 голосов
/ 12 января 2009

Если пакет называется testmod, и, следовательно, ваш файл инициализации - testmod/__init__.py, а ваш модуль в пакете - submod.py, то из файла submod.py вы можете просто сказать import testmod и использовать все, что вы хотите, это определено в testmod.

1 голос
/ 02 апреля 2009

В Django файл manage.py имеет from django.core.management import execute_manager, но execute_manager не является модулем. Это функция в модуле __init__.py каталога management.

1 голос
/ 12 января 2009

Я не совсем уверен, какова ситуация, но это может решить вашу проблему "другого имени":

import __init__ as top
top.some_function()

А может быть?:

from __init__ import some_function
some_function()
...