尝试导入嵌套模块时 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
我正在开发一个 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.javaimport 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