Окончательный ответ на относительный импорт в Python

Я знаю, что в Python есть много вопросов о тех же проблемах импорта, но, похоже, никто не смог предоставить четкий пример правильного использования.

Допустим, у нас есть пакет mypackage с двумя модулями foo и bar. Внутри foo нам нужно иметь доступ к bar.

Поскольку мы все еще разрабатываем его, mypackage отсутствует в sys.path.

Мы хотим иметь возможность:

  • импортировать mypackage.foo
  • запускать foo.py как сценарий и выполнять примеры использования или тесты из раздела __main__.
  • использовать Python 2.5

Как нужно сделать импорт в foo.py, чтобы быть уверенным, что он будет работать во всех этих случаях.

# mypackage/__init__.py
...

# mypackage/foo/__init__.py
...

# mypackage/bar.py  
def doBar()
    print("doBar")

# mypackage/foo/foo.py
import bar # fails with module not found
import .bar #fails due to ValueError: Attempted relative import in non-package

def doFoo():
    print(doBar())

if __name__ == '__main__':
    doFoo()
16
задан sorin 29 November 2011 в 11:05
поделиться