Python 项目逐渐增大,循环导入时,一不留神可能碰到错误:
ImportError: cannot import name ‘<name>’
出现此问题一般是因为在导入模块时顺序上了问题
看如下例子:
./test
├── main.py
├── sub_a.py
├── sub_b.py
# main.py
from sub_a import x
print(x + 1)
# sub_a.py
from sub_b import b
a = 1
x = a + b
print(x)
# sub_b.py
from sub_a import a
b = a + 1
运行:
python module_a.py
Traceback (most recent call last):
File ".\main.py", line 1, in <module>
from sub_a import x
File "~\test\sub_a.py", line 1, in <module>
from sub_b import b
File "~\test\sub_b.py", line 1, in <module>
from sub_a import a
ImportError: cannot import name 'a'
由main.py
进入sub_a.py
中执行from sub_b import b
语句,在这里程序进入sub_b.py
中执行,’sub_a.py’程序暂停执行,此时需要在sub_b.py
使用的sub_a.py
中的 a = 1
变量还没有生成,因此出现了上述错误。
要避免错误,要保证在导入模块中内容时,此内容在程序执行到此处时已定义。
module_a.py
改为:
a = 1
from sub_b import b
x = a + b
Flask 中的实际示例:
# app.py
from flask_mongoengine import MongoEngine
# 导入
from .views.main import main as main_blueprint
# 定义
db = MongoEngine()
# 使用
app.register_blueprint(main_blueprint)
# views.main.py
# 导入
from user import User
# 使用
Users.objects()
# users.py
# 导入
from app import db
# 使用
class Users(db.Document):
id = db.StringField(primary_key=True)
name = db.StringField(required=True)
app.py
文件改为:
# app.py
from flask_mongoengine import MongoEngine
# 定义
db = MongoEngine()
# 导入
from .views.main import main as main_blueprint
# 使用
app.register_blueprint(main_blueprint)