Странный непоследовательный python ImportError — возможная циклическая зависимость?

#python #import

#python #импорт

Вопрос:

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

radian/models.py определяет класс, называемый ACount

datalayer/radian.py в нем есть следующая строка:

 from radian.models import ACount
  

Когда я запускаю код (либо в интерактивном режиме, либо из основной программы), импорт завершается ошибкой, которая для меня не имеет смысла.

 >>> from radian.models import ACount
>>> import datalayer.radian
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/leopd/dev/dbproj/datalayer/radian.py", line 10, in <module>
    from radian.models import ACount
ImportError: No module named models
  

Мое лучшее предположение заключается в том, что где-то есть циклическая зависимость — которая radian импортирует что-то, что импортирует datalayer . Но я этого не вижу. И сообщение об ошибке не имеет для меня никакого смысла. Есть идеи, что происходит?

— ОБНОВИТЬ —

Я использую Python 2.6.1 на Mac. В __init__.py файлах есть некоторый код, но они импортируются только из стандартных пакетов python.

Комментарии:

1. Какую версию Python вы используете? Я бы рекомендовал включить абсолютный импорт, если он доступен.

2. У radian есть __init__.py файл?

3. Может ли radian.py файл пытаться импортировать models из самого себя?

Ответ №1:

Любой модуль в datalayer папке (включая radian.py ), когда он увидит from radian , будет считать, что datalayer/radian.py это соответствующий модуль. Возможно, вам потребуется сделать

 from __future__ import absolute_import
  

в datalayer/radian.py и других аналогично затронутых модулях, а затем проверьте все ваши импортированные файлы, чтобы убедиться, что они являются абсолютными. Возможно, вам удастся избежать переименования datalayer/radian.py и импорта, который ссылается на него, в зависимости от того, откуда берется ссылка на этот модуль.