首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图导入嵌套模块时的ModuleNotFound错误

试图导入嵌套模块时的ModuleNotFound错误
EN

Stack Overflow用户
提问于 2020-03-24 20:23:41
回答 1查看 1.1K关注 0票数 3

我正在使用下面列出的基本文件夹结构来处理Python项目,每个Python文件包含的示例都放在花括号中。

代码语言:javascript
复制
|   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导入到generate_recommendations.py中,并让所有导入都能工作。

我在文件ratingDAO.py中添加了以下导入语句

代码语言:javascript
复制
from core.rating import Rating

我还在文件generate_recommendations.py中添加了以下导入语句

代码语言:javascript
复制
from dao.ratingDAO import RatingDAO

当我执行ratingDAO.py时,它运行时没有任何错误。

但是,当我尝试执行generate_recommendations.py时,我会得到以下错误

代码语言:javascript
复制
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上看到了大约10篇与嵌套导入相关的文章,但我无法找到作者试图导入两个层次的示例。

如果这种导入在Python中是不可能的,我对如何管理Python项目中的文件持开放态度。

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

代码语言:javascript
复制
├───recommendation
|   |   GenerateRecommendations.java
│   ├───core
|   |     Rating.java
│   └───dao
|         RatingDAO.java 

并使用以下代码导入Rating.java中的RatingDAO.java,

代码语言:javascript
复制
import recommendation.core.Rating;

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

代码语言:javascript
复制
import dao.RatingDAO;

所有的东西都能用,但是Python不起作用,这就是为什么我选择了最初指定的文件夹结构。

这是我第一次在StackOverflow上问问题。我尽我最大的努力通过其他帖子来描述我的问题。如果不符合好问题的标准,请提前道歉。

希望得到答覆:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-24 20:40:58

当您运行python generate_recommendations.py时,这会将脚本的目录放在路径上(导入时搜索模块的sys.path)。当您在from core.rating import Rating中使用ratingDAO.py时,它将搜索名为core的包的路径,但是由于dao目录不在路径上,所以找不到它。

解决方案是在ratingDAO.py模块中使用相对导入:

代码语言:javascript
复制
from .core.rating import Rating

这样,它将相对于自己的位置搜索core包。如果您想从顶层目录运行ratingDAO.py,可以通过python -m dao.ratingDAO来运行(这个put是路径上的当前工作目录,然后搜索sys.path以查找一个名为dao.ratingDAO的模块并执行它)。

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

代码语言:javascript
复制
from dao.core.rating import Rating
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60838741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档