Как сделать относительный импорт в Python? - PullRequest
484 голосов
/ 16 сентября 2008

Представьте себе эту структуру каталогов:

app/
   __init__.py
   sub1/
      __init__.py
      mod1.py
   sub2/
      __init__.py
      mod2.py

Я кодирую mod1, и мне нужно импортировать что-то из mod2. Как я должен это делать?

Я пытался from ..sub2 import mod2, но я получаю "Попытка относительного импорта в неупакованном виде".

Я погуглил, но нашел только взломы "sys.path манипуляция". Разве нет чистого пути?


Редактировать: все мои __init__.py в настоящее время пусты

Edit2: я пытаюсь сделать это, потому что sub2 содержит классы, которые являются общими для подпакетов (sub1, subX и т. Д.).

Edit3: я ищу поведение, подобное описанному в PEP 366 (спасибо John B)

Ответы [ 15 ]

4 голосов
/ 24 сентября 2011

Взгляните на http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports. Вы могли бы сделать

from .mod1 import stuff
2 голосов
/ 29 июня 2011

С Python doc ,

В Python 2.5 вы можете переключить поведение импорта на абсолютный импорт, используя директиву from __future__ import absolute_import. Такое поведение абсолютного импорта станет будущим по умолчанию в будущей версии (вероятно, Python 2.7). Если абсолютный импорт установлен по умолчанию, import string всегда найдет версию стандартной библиотеки. Рекомендуется, чтобы пользователи начали как можно больше использовать абсолютный импорт, поэтому желательно начать писать from pkg import string в вашем коде

1 голос
/ 11 сентября 2012

Вдобавок к тому, что сказал Джон Б., похоже, что установка переменной __package__ должна помочь, вместо изменения __main__, которое может испортить другие вещи. Но, насколько я мог проверить, он не работает должным образом.

У меня та же проблема, и ни PEP 328, ни 366 не решают ее полностью, поскольку оба, к концу дня, нуждаются в том, чтобы заголовок пакета был включен в sys.path, насколько я понимаю.

Я должен также упомянуть, что я не нашел, как отформатировать строку, которая должна идти в эти переменные. Это "package_head.subfolder.module_name" или как?

1 голос
/ 17 марта 2012

Я обнаружил, что проще установить переменную окружения "PYTHONPATH" в верхнюю папку:

bash$ export PYTHONPATH=/PATH/TO/APP

тогда:

import sub1.func1
#...more import

Конечно, PYTHONPATH "глобальный", но это еще не доставило мне проблем.

0 голосов
/ 05 марта 2011

Предположим, вы работаете на верхнем уровне, затем в mod1 используйте:

import sub2.mod2 

вместо

from ..sub2 import mod2
...