Python模块导入困惑(从子模块导入的模块)

3
我有以下项目结构:
./app/__init__.py
./app/main/__init__.py
./app/main/views.py
./app/models.py
./app/resources/__init__.py
./app/resources/changesAPI.py
./config.py
./manage.py

app/models.py文件中有以下代码:

from app import db

dbapp/__init__.py 中被定义。

db = SQLAlchemy()

我从app/resources/__init__.py导入来自models.py的类:

from app.models import User, Task, TaskChange, Revision

然而,当模型尝试导入db时,它会失败:

Traceback (most recent call last):
  File "manage.py", line 5, in <module>
    from app import create_app, db, api
  File "/Users/nahuel/proj/ptcp/app/__init__.py", line 16, in <module>
    from app.resources.changesAPI import ChangesAPI
  File "/Users/nahuel/proj/ptcp/app/resources/__init__.py", line 5, in <module>
    from app.models import User, Task, TaskChange, Revision
  File "/Users/nahuel/proj/ptcp/app/models.py", line 1, in <module>
    from app import db
ImportError: cannot import name db

我做错了什么?

你可能想看看https://dev59.com/Jmkw5IYBdhLWcg3wus_K,了解一些关于替代方法的讨论 :-) - Sean Vieira
1个回答

3

您有一个循环导入。

您从manage.py导入create_appdbapi,这会触发app.resources.changesAPI模块的导入,然后再触发app/resources中的__init__.py包的导入,该包尝试导入您的models,但由于dbapp/__init__.py中未定义,因此失败。

您需要将导入ChangesAPI移到app/__init__.py文件中定义db行之后。在from app.resources.changesAPI import ChangesAPI之前在app/__init__.py中定义的任何名称都可以用于子包,之后定义的名称则不可用。


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