ImportError: cannot import name ‘db‘ from partially initialized module ‘project‘

22 篇文章 0 订阅
19 篇文章 3 订阅
本文详细解释了Python中出现ImportError:cannotimportname错误的原因,特别是循环依赖的情况,提供了修复方法,包括调整模块导入顺序和将db实例化为Flask扩展。作者给出了实际案例和解决方案步骤。
摘要由CSDN通过智能技术生成

一、 报错信息

ImportError: cannot import name 'db' from partially initialized module 'project' (most likely due to a circular import) (D:\projects\zfx_py\flask24\project\__init__.py)

编写完代码以后,运行falsk异常,控制台完整的信息为:
在这里插入图片描述
ImportError:无法从部分初始化的模块“project”导入名称“db”(很可能是由于循环导入),这种问题常出现在导入蓝图的时候,我们先来看看为啥会出现这类问题

二、python中ImportError: cannot import name 错误的原因

如果代码中的 import 语句在成功导入模块时遇到困难,则会出现 Python 中的 ImportError异常。

出现此类问题的原因通常是外部库安装错误或您尝试导入的模块路径无效。
当尝试导入的类处于循环依赖关系中时,通常会发生这种导入错误(也就是报错中most likely due to a circular import)。

2.1、 什么是循环依赖

当两个模块尝试同时导入彼此以使它们相互依赖时,通常会发生循环依赖。

假设我们有几个模块:demo1.py 和 demo2.py。内容如下:
在这里插入图片描述
可以看到这两个模块是相互依赖的。在这种情况下,当我们使用像 from demo1 import demo1_func1from demo2 import demo2_func2 这样的语句时,就会出现循环依赖。

三、修复Python中的 ImportError: cannot import name 错误

避免循环依赖,Python 可以自己完成。
必须修改 import 语句,而不是导入模块的内容,而是导入两个文件中的整个模块。
demo1.py源码如下:

import demo2

def demo1_func1():
    print('demo1_func1')
    demo2.demo2_func2()


import demo1

def demo2_func1():
    print('demo2_func1')
    demo1.demo1_func1()


def demo2_func2():
    print('demo2_func2')


if __name__=='__main__':
    demo2_func1()

执行结果如下:
在这里插入图片描述

四、解决方法一:根据前两步分析,找到项目中falsk运行报错的位置

报错提示是导入db循环了,这种情况又常出现在蓝图的使用中,正好先看我的蓝图,下面是我的源码,可以看到我是先导入了蓝图,才生成了db;
在这里插入图片描述
那来看看我的蓝图中真如前面说的,导入了db?在源码里看到我导入了models,那极大可能就是models中用到了db。
在这里插入图片描述

来看看modes中的源码:
在这里插入图片描述
还真是哈,真相了家人们。那这种很好调整哈,我们只要先创建db,再导入那些用到db的模块就可以了,如下图所示:
在这里插入图片描述
就正常喽
在这里插入图片描述

五、解决方法二:将实例化db对象处理成扩展

Flask:扩展开发的文档
扩展是为FlaskTM应用程序添加功能的额外程序包。根据文档可知:扩展实例独立于应用程序而存在。用户在项目中的其他模块可以通过from project import hello 在应用程序存在之前,在蓝图中使用该扩展。
在这里插入图片描述

那么在我项目的根目录下,新建一个extension.py文件,在这里实例化SQLAlchemy。

from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS

db = SQLAlchemy()

cors = CORS()

然后,在项目任何位置,调用就可以,如下所示:
在这里插入图片描述

import os

from flask import Flask


from project.extension import db, cors
from project.config import config  # 导入存储配置的字典

from project.blog import blog_base_blueprint


def create_app(config_name=None):
    if config_name is None:
        config_name = os.getenv('FLASK_ENV', 'development')  # 从环境变量中获取FLASK_ENV,并设置默认值

    app = Flask('project')

    # setup config,导入配置,根据配置环境实例化
    app.config.from_object(config[config_name])

    # 注册扩展
    register_extension(app)

    # 注册蓝图
    register_blueprint(app)

    return app

# 注册flask拓展
def register_extension(app: Flask):
    db.init_app(app)
    db.app = app
    cors.init_app(app, origins="*")

# 注册蓝图
def register_blueprint(app: Flask):
    app.register_blueprint(blog_base_blueprint)

除此处修改以外,因为我还注册了蓝图,蓝图里有使用到模型,所以模型里导入db的方式也要改变一下,如下所示:
在这里插入图片描述

六、写在最后

宣传一波:大家若是有人想北京租房可以联系我,主要是物资学院、通州北关、北苑、草房的房子。(注:我不是中介哟,我也不打算转行做中介)
在这里插入图片描述

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中的报错信息表明在导入模块时出现了循环导入的错误。这可能是因为你的Python文件名与导入的包名重复了。为了解决这个问题,你可以将文件名修改为与导入的包名不同的名称,比如将文件名修改为flask1.py。然后再次运行程序,确保你正确导入了Flask模块并创建了一个Flask应用对象。你可以使用以下代码作为参考: ```python from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'hello Flask!' if __name__ == '__main__': app.run() ``` 引用\[3\]中的信息显示,你的Flask应用正在运行,并监听在http://127.0.0.1:5000/上。你可以在浏览器中访问该地址来查看你的应用是否正常运行。 关于你提到的ImportError: cannot import name 'utils' from partially initialized module 'labelme'的问题,根据提供的信息,无法确定具体的原因。可能是由于模块之间的循环导入或者模块不存在导致的。你可以检查一下你的代码,确保你正确导入了utils模块,并且该模块存在于你的项目中。如果问题仍然存在,你可以提供更多的代码和错误信息,以便我们能够更好地帮助你解决问题。 #### 引用[.reference_title] - *1* *2* *3* [问题解决:ImportError: cannot import name ‘Flask‘ from partially initialized moduleflask](https://blog.csdn.net/xiaofeixia002X/article/details/128186094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值