【问题标题】:ModuleNotFound error in Python when trying to import nested modules尝试导入嵌套模块时 Python 中的 ModuleNotFound 错误
【发布时间】:2020-03-24 20:23:41
【问题描述】:

我正在开发一个 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 上看到了大约 10 篇与嵌套导入相关的帖子,但我找不到作者尝试深度导入两个级别的示例。

如果在 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 这是我第一次在 StackOverflow 上提问。我尽力通过参考其他帖子来描述我的问题。如果不符合好问题的标准,请提前道歉。

希望得到答复! :-)

【问题讨论】:

  • 不要把这个当回事,但是 Python 没有每个文件 1 个类的 Java 限制。不要用 Python 编写 Java。 dirtsimple.org/2004/12/python-is-not-java.html 我意识到这并不能回答您的问题,但是您的模块结构对我来说似乎不必要地复杂。 ratingDAO.py { contains a class named RatingDAO } => 我已经在想哈! Java 程序员 在您提到该语言之前。

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


【解决方案1】:

当您运行 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

【讨论】:

  • 根据您的建议,我在ratingDAO.py 模块from .core.rating import Rating 中使用了以下导入语句。现在,如果我运行generate_recommendations.py,我不会得到任何ModuleNotFoundError。谢谢你。但是,如果我现在尝试使用python ratingDAO.py 单独运行ratingDAO.py,它会给我以下错误。 from .core.rating import Rating ModuleNotFoundError: No module named '__main__.core'; '__main__' is not a package。以类似的方式,如果我在ratingDAO.py 中使用from dao.core.rating import Rating 并运行generate_recommendations.py,则不会出现错误。
  • 但是,如上所述执行ratingDAO.py,我得到from dao.core.rating import Rating ModuleNotFoundError: No module named 'dao'
  • @RanajoySaha 你需要从dao目录外部运行python -m dao.ratingDAO
  • 非常感谢。现在代码可以工作了。谢谢!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2012-08-08
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多