我之前曾经提过一个类似的问题(链接),但是没有找到解决方案,所以我尽可能简化了我的代码来说明问题。
下面的代码可以正常运行,但当我在models.py
中包含from run import db
时,就会出现ImportError: cannot import name 'Site'
(完整错误如下)
然而,当我使用from models import *
时,一切都正常运行(但我不想这样做)。
为什么会发生这种情况?
run.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///database/db.db"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy()
from models import Site
# from models import *
print (Site.hello())
models.py
# Uncommenting the import line below produces the error
# from run import db
class Site():
def hello():
print ("hello world")
错误
(venv) abc:projectx me$ python run.py
Traceback (most recent call last):
File "run.py", line 16, in <module>
from models import Site
File "/Users/me/projectx/models.py", line 1, in <module>
from run import db
File "/Users/me/projectx/run.py", line 16, in <module>
from models import Site
ImportError: cannot import name 'Site'
目录结构
projectx
__pycache__
database
venv
__init__.py
run.py
models.py
ModuleNotFoundError: 找不到模块名为 '__main__.models';'__main__' 不是一个包。
- stefrun
导入model
,而model
又导入run
;你有一个循环依赖。当第一次导入model
时,它试图定义模块,而run
则尝试从model
中导入Site
,但这还没有被第一个导入定义。我建议重新审查设计以避免循环引用。 - chepner