You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask报错:ImportError: attempted relative import with no known parent package 解决方案求助

Flask相对导入错误&未访问提示问题解决方案

嘿,我来帮你搞定这两个问题!先解决你的相对导入错误,再处理main.py的提示。

一、相对导入错误的原因

你遇到的 ImportError: attempted relative import with no known parent package,本质是Python没把models.py识别为某个包的子模块。当你直接运行app.py或者models.py时,Python会把这个文件当成顶层脚本文件,而非包的一部分,这时候用.的相对导入自然找不到对应的父包了。

二、具体解决方案

根据你的项目结构,我给你两种可行的办法:

方法1:改用绝对导入(简单直接)

修改models.py里的导入语句,把相对导入换成绝对导入:

# models.py
from flask_login import UserMixin
from app import db  # 替换原有的相对导入

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    fname = db.Column(db.String(100))
    lname = db.Column(db.String(100))
    email = db.Column(db.String(100), unique=True)
    password = db.Column(db.String(100))

如果运行时还是报错,可以在main.py开头加一段代码,确保项目根目录在Python的搜索路径里:

# main.py 开头添加
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

方法2:将app目录转为标准Python包(更规范)

  1. 在app文件夹里创建一个__init__.py文件(空文件即可,用来标识这是一个Python包)
  2. 调整app.py的结构,把db的定义移到__init__.py里,让整个包共享这个实例:
# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db.init_app(app)
    return app
  1. 修改原app.py的导入逻辑(也可以改名为routes.py让命名更清晰):
# app/app.py
from . import create_app, db
from .models import User

app = create_app()

# 示例路由
@app.route('/')
def home():
    return "Hello World!"
  1. 最后修改models.py的导入(现在因为app是标准包,相对导入就能生效了):
# models.py
from flask_login import UserMixin
from . import db

class User(UserMixin, db.Model):
    # 你的模型代码保持不变

之后运行项目时,要从项目根目录(即包含app文件夹的Flask_app目录)启动,比如用命令:

flask --app app run

或者在main.py里导入并运行:

# main.py
from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

三、main.py里"db is not accessed"的提示

这个提示很容易解决:要么是你在main.py里导入了db但没实际使用,要么是没导入但代码里有相关引用。如果不需要直接操作db,就删掉对db的导入;如果需要用db,就添加实际使用的逻辑,比如初始化数据库:

# main.py
from app import create_app, db

app = create_app()

with app.app_context():
    db.create_all()  # 这里使用了db,提示就会消失

if __name__ == '__main__':
    app.run(debug=True)

内容的提问来源于stack exchange,提问作者user16591216

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:29:08