Python 3.8错误
ImportError: cannot import name 'mydb' from partially initialized module 'connection'
(most likely due to a circular import) (C:\U
sers\Mark04\Documents\Python tutorial\databasing\connection.py)
当我尝试执行子模块select.py
import bcrypt;
from connection import mydb
具有导入的模块连接。py
import mysql.connector
mydb = "Success";
我不知道这是什么问题,当我从模块connection.py中删除导入mysql.connector时,没有出现该错误,但它没有解决我的问题
> python -m select
答案 0 :(得分:12)
要回答上述问题,我们需要了解循环依赖的问题。
要了解循环依赖性,我想在您面前布置一个简单的示例。
我认为每个应用都需要具有以下几个基本块:
+----------------+-------------------------------------------------------------------------------------------+
| Filename | Description |
+----------------+-------------------------------------------------------------------------------------------+
| app.py | Creates the app and starts the server. |
| models.py | Define what the entity will look like (e.g, UserModel has username, email, password etc.) |
| controllers.py | Fetches Data from database, generates HTML and sends the response to the user browser. |
+----------------+-------------------------------------------------------------------------------------------+
我们的简单示例还将包含三个文件
project/
- app.py ( Creates and starts the server)
- models.py ( Class to model a user)
- controllers.py ( We will fetch data from database, and return html to user.)
app.py文件的内容如下所示:
# =============
# app.py
# =============
# Define the application
app = Flask()
# Define the Database
db = SQLAlchemy(app)
# Register the Controller
from .controllers import auth_controller
app.register_blueprint(auth_controller)
models.py文件的内容如下所示:
# =============
# models.py
# =============
from .app import db
# We will not focus on implementation
class User(db.Model):
pass
controllers.py文件的内容如下所示:
# =============
# controllers.py
# =============
from flask import Blueprint
from .models import User
# Create the auth app
auth = Blueprint('auth', __name__)
# Define the Rotues
@auth.route('/login')
def login():
return "I will fetch some data and allow the user to login"
我认为现在,我已经绘制了应用程序的示意图,现在让我们继续了解该应用程序的工作方式。
app.py
开始app
文件中的app.py
变量在内存中创建。db
中的app.py
变量在内存中创建。auth
文件导入controllers.py
,我们切换到```controllers.py``文件Blueprint
。User
,我们切换到models.py
文件。models.py
文件中,我们导入了db
(由于它是在第3步中创建的,因此我们能够导入它)上述顺序中最重要的导入步骤是step 7
,因为这将在短时间内导致我们应用程序中循环依赖的问题。
现在,我们将尝试更改app.py
文件以引入循环依赖的问题。
现在,作为开发人员,我们可能会认为所有导入都应位于文件的顶部,这是否会使您的代码更整洁。当然是!它确实使代码更整洁。
# ============================
# Refactored app.py file
# ============================
from .controllers import auth_controller
# ......
# Rest of the file is same, we only shifted this import at the top
现在,我们的应用程序中存在循环依赖问题。让我告诉你如何?
app.py
文件开始auth_controller
文件中导入controllers.py
controllers.py
文件并进行处理。models.py
文件以导入User
models.py
文件中,我们从db
导入app
(但数据库尚不存在。) 现在,我想您明白了,如果只是看到问题,那就是循环依赖的一个例子。同样的问题也导致您遇到ImportError
。
解决方案是检查import statements
并将其放在正确的位置。有时,我们使用代码格式化程序,它重构顶部的所有import语句。这可能会给您造成问题。
我希望这可以回答您的问题!
答案 1 :(得分:8)
进口顺序很重要:
示例:
# A.py
# empty file
# B.py
import A
# file1.py
import A # A gets imported before B can import A
import B # B tries to re-import A but A is already imported
将顺序更改为:
# file1.py
import B
import A
答案 2 :(得分:4)
尝试循环导入时出现此错误。确保您没有创建与要在目录中导入的模块名称相同的文件。
答案 3 :(得分:1)
该错误表明它“很可能是由于循环进口”。 检查并确保在要导入的文件中没有导入显示的文件。如果您是,那将使您陷入困境。 例如我的文件是file.py,而我正在导入file2.py: 导入文件>导入文件2>导入文件>导入文件2>导入文件... 确保没有发生这种情况。我遇到了与您相同的问题,并且此问题得以解决。
答案 4 :(得分:1)
您可以通过不导入文件顶部的冲突导入之一来消除此错误。如果您只想在某个地方使用导入的内容,则可以在函数内进行导入。
def foo():
from x import y
答案 5 :(得分:0)
我降低了导入而不是将所有导入都放在顶部。
db = SQLAlchemy(app)
migrate = Migrate(app, db)
from models import User
答案 6 :(得分:-1)
答案 7 :(得分:-7)
我不知道根本原因,但是如果您回滚到Python 3.7,它将完全正常工作