尝试导入嵌套模块时 Python 中出现 ModuleNotFound 错误

ModuleNotFound error in Python when trying to import nested modules

我正在开发一个 Python 项目,其基本文件夹结构如下所列,每个 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:我想在ratingDAO.py中导入rating.py,又想在ratingDAO.py中导入ratingDAO.py =51=],并让所有导入正常工作。

我在文件中添加了以下导入语句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'

我无法解决这个错误。我在 Whosebug 上看到了大约十篇与嵌套导入相关的帖子,但我无法找到作者尝试导入两层深度的示例。

如果在 Python 中无法进行此类导入,我愿意接受关于如何管理我的 Python 项目中的文件的想法。

在 Java 中,我会使用以下文件夹结构,

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

并使用以下代码在 RatingDAO.java、

中导入 Rating.java
import recommendation.core.Rating;

并使用以下代码将 RatingDAO.java 导入 GenerateRecommendations.java

import dao.RatingDAO;

一切都会奏效,但对 Python 却行不通,这就是我选择初始指定文件夹结构的原因。

P.S 这是我第一次在 Whosebug 上提问。我尽力参考其他帖子来描述我的问题。不符合好问题标准提前致歉

希望得到答复! :-)

当您 运行 python generate_recommendations.py 时,这会将脚本的目录放在路径中(sys.path 在导入时搜索模块)。当您在 ratingDAO.py 中使用 from core.rating import Rating 时,它会在路径中搜索名为 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