我正在使用下面列出的基本文件夹结构进行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上提问。我通过参考其他帖子尽力描述我的问题。如果不符合常见问题的标准,请提前道歉。
希望得到答复! :-)
答案 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