#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
и импорта, который ссылается на него, в зависимости от того, откуда берется ссылка на этот модуль.