Python абсолютного импорта в модуль не удается - PullRequest
5 голосов
/ 16 ноября 2011

У меня есть проект, который выглядит так:

my_project/
          __init__.py -- empty
          run.py
          datacheck/
                  __init__.py -- empty
                  datacheck.py -- containing class DataCheck(object)
                  config.py -- containing BusinessConfig(object)
                  business.py -- containing class BusinessCheck(DataCheck)

Мой PYTHONPATH настроен на включение / my_project.

В run.py у меня есть следующий код:

from datacheck.business import BusinessCheck
business = BusinessCheck()
business.check_data()

В business.py у меня есть следующие неудачные операции импорта:

from datacheck.config import BusinessConfig
from datacheck.datacheck import DataCheck

Относительный импорт, такой как from .config import BusinessConfig, работает - однако я читал во многих потоках, что абсолютный импорт предпочтителен.

Чтобы сделать простой тест, я также создал следующее:

myproject/
          __init__.py -- empty
          run_test.py
          test/
              __init__.py -- empty
              test1.py -- containing class Test1(object)
              test2.py -- containing class Test2(Test1)

run_test.py импортирует и запускает класс Test2, это не удалось.

Это оставило меня немного ошеломленным, я не понимаю, почему мой абсолютный импорт в datacheck не работает - кто-нибудь может объяснить?

Ответы [ 2 ]

7 голосов
/ 16 ноября 2011

Вы должны предпочесть абсолютный импорт, если ваш модуль может использоваться как __main__, как объяснено в документации . Если нет, относительный импорт в порядке.

Этот импорт завершается неудачно, потому что ваш пакет datacheck содержит модуль datacheck (то же имя). При поиске имени Python сначала неявно заглядывает внутрь пакета. Там он находит модуль datacheck. Однако этот модуль не содержит ничего с именем config, поэтому импорт завершается неудачей.

Если вы хотите использовать абсолютный импорт, переместите все содержимое из модуля datacheck в __init__.py пакета или переименуйте его.

2 голосов
/ 09 ноября 2015

Я знаю, что это много лет спустя, но ради других, ищущих здесь, я смог решить аналогичную проблему с этим битом кода:

from __future__ import absolute_import

После этого абсолютный импорт работал нормальнов Python 2.6 и 2.7.

...