无法从Python中部分初始化的模块“连接”中导入名称“ mydb”

时间:2019-12-03 12:13:52

标签: python importerror

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

8 个答案:

答案 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"

我认为现在,我已经绘制了应用程序的示意图,现在让我们继续了解该应用程序的工作方式。

  1. 该应用从app.py开始
  2. app文件中的
  3. app.py变量在内存中创建。
  4. db中的
  5. app.py变量在内存中创建。
  6. 现在,要从auth文件导入controllers.py,我们切换到```controllers.py``文件
  7. 我们从烧瓶中导入Blueprint
  8. 要导入User,我们切换到models.py文件。
  9. 现在,在models.py文件中,我们导入了db(由于它是在第3步中创建的,因此我们能够导入它)
  10. 程序继续进行,依此类推。……

上述顺序中最重要的导入步骤是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

现在,我们的应用程序中存在循环依赖问题。让我告诉你如何?

  1. 我们的应用从app.py文件开始
  2. 首先,我们需要从auth_controller文件中导入controllers.py
  3. 让我们访问controllers.py文件并进行处理。
  4. 我们从烧瓶中导入蓝图
  5. 让我们切换到models.py文件以导入User
  6. 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)

如上所述,您很有可能正在使用代码格式化程序,该代码格式化程序将所有import语句放在顶部。 只需进入设置并在保存时禁用该格式即可。

enter image description here

转到错误的文件,更正导入语句的顺序并保存。

答案 7 :(得分:-7)

我不知道根本原因,但是如果您回滚到Python 3.7,它将完全正常工作