Ошибка ModuleNotFound в Python при попытке импортировать вложенные модули - PullRequest
3 голосов
/ 24 марта 2020

Я работаю над проектом Python со структурой папок basi c, перечисленной ниже, и примеры того, что содержит каждый файл Python, заключены в фигурные скобки.

|   generate_recommendations.py
├───.ipynb_checkpoints
├───.vscode
├───csv
├───dao
|   |   ratingDAO.py { contains a class named RatingDAO }
│   ├───config
│   ├───core
|   |       rating.py { contains a class named Rating }
│   ├───db

OBJECTIVE : я хочу импортировать rating.py в ratingDAO.py и, в свою очередь, хочу импортировать ratingDAO.py в generate_recommendations.py, и все операции импорта будут работать.

Я добавил следующий оператор импорта в файл ratingDAO.py

from core.rating import Rating

И я также добавил следующий оператор импорта в файл generate_recommendations.py

from dao.ratingDAO import RatingDAO

Когда я выполняю ratingDAO.py, он запускается без ошибок.

Но когда я пытаюсь выполнить generate_recommendations.py, я получаю следующую ошибку

Traceback (most recent call last):
  File "generate_recommendations.py", line 3, in <module>
    from dao.ratingDAO import RatingDAO
  File "D:\MEGASync\BSc Computer\Research Papers\recommendation-engine\dao\ratingDAO.py", line 3, in <module>
    from core.rating import Rating
ModuleNotFoundError: No module named 'core'

Я не могу разрешить ошибка. Я видел около десяти сообщений в StackOverflow, связанных с вложенным импортом, но я не смог найти примеров, когда автор пытался импортировать на два уровня глубиной.

Если такой импорт невозможен в Python, я открыт для идеи о том, как мне следует go об управлении файлами в моем проекте Python.

В Java я бы использовал следующую структуру папок,

├───recommendation
|   |   GenerateRecommendations.java
│   ├───core
|   |     Rating.java
│   └───dao
|         RatingDAO.java 

и использовал следующий код для импорта Rating. java в RatingDAO. java,

import recommendation.core.Rating;

и использовал следующий код для импорта RatingDAO. java в GenerateRecommendations. java

import dao.RatingDAO;

и все работало бы, но то же самое не работало для Python, поэтому я выбрал начальную указанную структуру папок.

PS Я впервые задаю вопрос о StackOverflow , Я старался изо всех сил описать мою проблему, ссылаясь на другие сообщения. Заранее извиняюсь, если это не соответствует стандартам хороших вопросов.

Надеемся на ответ! : -)

1 Ответ

1 голос
/ 24 марта 2020

Когда вы запускаете python generate_recommendations.py, это помещает каталог скрипта в путь (sys.path, в котором выполняется поиск модулей при импорте). Когда вы используете from core.rating import Rating в ratingDAO.py, он будет искать путь для пакета с именем core, но, поскольку каталог dao не находится в пути, он не может быть найден.

Решение состоит в том, чтобы используйте относительный импорт в модуле ratingDAO.py:

from .core.rating import Rating

Таким образом, он будет искать относительно пакета core относительно его собственного местоположения. Если вы хотите запустить ratingDAO.py из каталога верхнего уровня, вы можете сделать это через python -m dao.ratingDAO (это помещает текущий рабочий каталог в путь, а затем ищет sys.path модуль с именем dao.ratingDAO и выполняет его).

Или вы можете использовать абсолютный импорт по отношению к каталогу верхнего уровня иерархии:

from dao.core.rating import Rating
...