我正在使用下面列出的基本文件夹结构来处理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 }
│ ├───dbOBJECTIVE:我希望在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 并使用以下代码导入Rating.java中的RatingDAO.java,
import recommendation.core.Rating;并使用以下代码将RatingDAO.java导入GenerateRecommendations.java
import dao.RatingDAO;所有的东西都能用,但是Python不起作用,这就是为什么我选择了最初指定的文件夹结构。
这是我第一次在StackOverflow上问问题。我尽我最大的努力通过其他帖子来描述我的问题。如果不符合好问题的标准,请提前道歉。
希望得到答覆:)
发布于 2020-03-24 20:40:58
当您运行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来运行(这个put是路径上的当前工作目录,然后搜索sys.path以查找一个名为dao.ratingDAO的模块并执行它)。
或者可以使用相对于层次结构顶层目录的绝对导入:
from dao.core.rating import Ratinghttps://stackoverflow.com/questions/60838741
复制相似问题