问题
Python 3.8 error
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)
When I tried to execute child module select.py
import bcrypt;
from connection import mydb
That has an imported module connection.py
import mysql.connector
mydb = "Success";
I dunno what is the problem, the error doesn't appear when I remove import mysql.connector from my module connection.py but it does not solved my problem
> python -m select
回答1:
To answer the above question, we need to understand the problem of circular dependency.
To understand the circular dependency, I want to layout a simple example, in front of you.
I think every app needs to have the few basic blocks as follows:
+----------------+-------------------------------------------------------------------------------------------+
| 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. |
+----------------+-------------------------------------------------------------------------------------------+
Our simple example will also have three files
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.)
The contents of the app.py file will look as follows:
# =============
# 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)
The contents of the models.py file will look as follows:
# =============
# models.py
# =============
from .app import db
# We will not focus on implementation
class User(db.Model):
pass
The contents of the controllers.py file will look as follows:
# =============
# 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"
I think now, I have laid out a diagram of our app, now let's proceed to understanding how the app will work.
- The app starts from
app.py
app
variable inside theapp.py
file gets created in memory.db
variable inside theapp.py
gets created in memory.- Now, to import
auth
fromcontrollers.py
file we switch to ```controllers.py`` file - We import
Blueprint
from flask. - To import
User
, we switch tomodels.py
file. - Now, inside
models.py
file we importdb
(We are able to import it because it was created in step 3) - And program continues so on and so on....
The most important import step in the above sequence is step 7
, becuase it will cause the problem of circular dependency in our app, in just a moment.
Now we will try to change the app.py
file to introduce the problem of circular dependency.
Now, as a developer, we might think that all our imports should be at the top of the file, doesn't it make your code cleaner. Yes, of course! it does make the code cleaner.
# ============================
# Refactored app.py file
# ============================
from .controllers import auth_controller
# ......
# Rest of the file is same, we only shifted this import at the top
Now, we have a problem of circular dependency in our app. Let me show you, how?
- Our app starts from
app.py
file - First, we need to import
auth_controller
fromcontrollers.py
file - Let's visit the
controllers.py
file, and process it. - From flask we import Blueprint
- Let's switch to
models.py
file to importUser
- Inside
models.py
file, we importdb
fromapp
(But db does not exist yet.)
Now, I think you got the point, The problem if just saw, was an example of circular dependency. The same problem is causing the ImportError
in your case.
The solution would be to inspect the import statements
and put them at the right place. Sometimes, we use code formatter, and it refactors all the import statements at the top. This might be causing the problem for you.
I hope the this may answer your question!
回答2:
The order of the imports matters:
Example:
# 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
change the order to:
# file1.py
import B
import A
回答3:
This error comes when you are attempting circular import. make sure you have not created any file with the same name with that of the module you are trying to import in the directory.
回答4:
The error says that it is "most likely due to a circular import". Check to make sure that in the files you are importing you are not importing the file you showed. If you are that makes a circle of importing. for example my file is file.py and I am importing file2.py: import file > import file2 > import file > import file2 > import file... Make sure that is not happening. I had the same problem as you and this fixed it.
回答5:
As mentioned above, most likely you are using a code formatter which puts all the import statements at the top. Just go to settings and disable the format on save.
Go to the file with error, correct the order of import statements and save.
回答6:
I don't know the root cause, but it will work perfectly fine if you roll back to Python 3.7
来源:https://stackoverflow.com/questions/59156895/cannot-import-name-mydb-from-partially-initialized-module-connection-in-pyth