Не удается создать модуль импорта

#python

#python

Вопрос:

У меня возникли проблемы с циклическими зависимостями, но я нашел в Интернете несколько советов о том, что мне лучше импортировать весь модуль, а не отдельные элементы в модуле. До проблемы с циклической зависимостью у меня не было проблем с импортом.

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

Итак, у меня есть эта файловая структура:

 └── root
    ├── models
    │   ├── __init__.py
    │   ├── a.py
    │   └── b.py
    └── c.py
  

В __init__.py у меня есть

 from models.a import A
from models.b import B
  

И в c.py

 import models

# code

models.A.func()
  

Но я получаю сообщение об ошибке module 'models' has no attribute 'A' . Поскольку A и B ссылаются друг на друга, сначала я получал циклический импорт, но теперь, когда они разрешены, я не могу заставить модели отображаться вообще.

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

1. Как вы запускаете свой код? IDE или командная строка? Установлена ли у вас переменная среды PYTHONPATH? Если да, то какова его ценность?

2. Используйте print(models) , чтобы убедиться, что он импортирует правильный.

3. @Code-Apprentice Это в экземпляре docker под управлением gunicorn. Корень находится в PYTHONPATH , и пока я не столкнулся с этой проблемой циклического импорта, у меня не было никаких проблем с импортом чего-либо.

4. Это проект Django? models Действительно ли он находится в корне проекта? Или у вас есть project/app/models ?

5. @Code-Apprentice На самом деле это приложение flask, но я использую движок модели Django. Итак, да, это в структуре, которую вы упомянули. Я не думал, что это имеет значение, поэтому я упростил код ради вопроса.

Ответ №1:

Вам либо нужно добавить каталог вашего проекта в PYTHONPATH , либо вам нужно сделать

 from . import models
  

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

1. Итак, я должен добавить каждый подкаталог в PYTHONPATH ? У меня уже есть корень в PYTHONPATH .

2. @Rohit Нет, только корневой каталог проекта.

Ответ №2:

ваш __init__.py файл не требует никаких изменений. Я думаю, что в c.py файл, введите следующим образом :

 modele_name.function_name()
  

Я полагаю, что если вы импортировали эту функцию в свой __init__.py файл, это вам поможет.
Для получения более подробной информации, пожалуйста, отредактируйте свой вопрос и добавьте ссылку на git вашего репозитория