ModuleNotFoundError: Нет модуля с именем 'listings', несмотря на наличие каталога в PATH

У меня структура файла выглядит следующим образом.

remindMe
│
│
├───remind_me_django
│   └───listings
│           models.py
│           __init__.py
│
└───scrapy
    └───scrapy_project
        │   items.py
        │   __init__.py
        │
        └───spiders

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

sys.path.append("C:\\Users\\Denze\\Projects\\remindMe\\remind_me_django\\listings")

from listings.models import Product

Я также пробовал:

from remind_me_django.listings import Product

Забавно, что если я щелкну правой кнопкой мыши на импорте в VSCODE и перейду к его определению, откроется файл init этого модуля, так что VSCODE знает, на что я ссылаюсь, а Python нет?

root
├── remind_me_django
│   └── listings
│       └── models.py
└── run.py

models.py:

var = "the var"

run.py

import sys

sys.path.append("/Users/user/root/remind_me_django/listings")

try:
  from listings.models import var
except:
  print('here is exception')

from models import var
print("here is OK. var is", var)

sys.path.append("/Users/user/root/remind_me_django")

from listings.models import var
print("here is also OK. var is", var)

вывод:

here is exception
here is OK. var is the var
here is also OK. var is the var

Объяснение:

После добавления listings в системный путь python начнет искать библиотеки и в каталоге listings. А что у нас внутри listings? Правильно! Внутри listings у нас есть models.py, поэтому нам нужно сделать from models import something

Если вы добавите remind_me_django к системному пути, python будет проверять папки и файлы внутри remind_me_django. А библиотека out находится внутри listings/models.py, поэтому нам нужно сделать from listings.models import something (или from listings import models и использовать ее как some_variable = models.something)

Но! Я не рекомендую добавлять пользовательские системные пути с помощью sys.path. Лучшая практика - делать импорт на основе структуры проекта

Вернуться на верх