Python,无法导入

3

我之前曾经提过一个类似的问题(链接),但是没有找到解决方案,所以我尽可能简化了我的代码来说明问题。

下面的代码可以正常运行,但当我在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

2
这两个文件在同一个目录下吗? - noamgot
1
请问您能否添加您的架构树吗?请注意,您可以删除所有与Flask有关的内容,我们不需要它。 - BlueSheepToken
@noamgot 是的,它们是。 - stef
@seralouk 是的,我有看到这个错误信息:ModuleNotFoundError: 找不到模块名为 '__main__.models';'__main__' 不是一个包。 - stef
1
run 导入 model,而 model 又导入 run;你有一个循环依赖。当第一次导入 model 时,它试图定义模块,而 run 则尝试从 model 中导入 Site,但这还没有被第一个导入定义。我建议重新审查设计以避免循环引用。 - chepner
显示剩余3条评论
1个回答

3
你正在将模块“models”中的Site导入到模块“run”中,同时将模块“run”中的db导入到模块“models”中,因此你遇到了循环依赖问题。
为了解决这个问题,你应该保持你的数据模型简单,所以我会从“models”模块中删除对“run”模块的依赖,但如果你仍然需要它,那么你应该考虑创建一个包含两者的单一模块,因为在这种情况下,将所有相关代码放在一个单元中是明智的。

的确,我创建了一个独立的数据库模块,并将其包含在两个文件中,现在它运行正常。如此简单,却很难发现。谢谢。 - stef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接