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
. Лучшая практика - делать импорт на основе структуры проекта