Python3报ImportError: attempted relative import with no known parent package如何解决
错误根因
你触发报错的核心原因是直接执行routes.py文件时,Python会将该文件所在的routes目录作为顶级执行上下文,不会识别上层的api包结构,因此相对导入语法里的..找不到对应的父包,和你是否添加空的__init__.py没有关系。
可用解决方案
方案1:以模块方式启动脚本
不要直接运行routes.py,进入api文件夹的上一级根目录,执行以下命令启动即可,原有相对导入写法不需要修改:
python -m api.routes.routes
这种执行方式会将当前工作目录自动加入Python的模块搜索路径,完整识别api包的层级结构。
方案2:添加入口文件统一启动
调整项目结构,在api文件夹的同级目录新增启动入口main.py,内容如下:
from api.routes.routes import app if __name__ == '__main__': app.debug = True app.run(host='localhost', port=8000)
之后删除routes.py里的if __name__ == '__main__'相关代码,直接运行main.py即可,原有相对导入写法不需要修改。
方案3:修改为绝对导入(适合需要直接运行routes.py的场景)
在routes.py最开头手动将项目根目录加入模块搜索路径,之后改用绝对导入写法:
import sys from pathlib import Path # 将api文件夹的上一级根目录加入搜索路径 sys.path.append(str(Path(__file__).parent.parent.parent)) from flask import Flask from api.db_setup import db_connect app = Flask(__name__) db = db_connect.start_database() if __name__ == '__main__': app.debug = True app.run(host='localhost', port=8000)
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

