尝试导入嵌套模块时,Python中的ModuleNotFound错误

时间:2020-03-24 20:23:41

标签: python python-3.x python-import importerror

我正在使用下面列出的基本文件夹结构进行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

目标:我想在RatingDAO.py中导入rating.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中无法进行此类导入,那么我对如何处理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来说却不起作用,这就是为什么我选择了初始指定的文件夹结构。

P.S这是我第一次在StackOverflow上提问。我通过参考其他帖子尽力描述我的问题。如果不符合常见问题的标准,请提前道歉。

希望得到答复! :-)

1 个答案:

答案 0 :(得分:2)

运行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中搜索名为{{ 1}}并执行它。

或者您可以相对于层次结构的顶级目录使用绝对导入:

dao.ratingDAO