Python模块导入难题(子模块中的模块)

3 投票
1 回答
722 浏览
提问于 2025-04-18 15:02

我有一个这样的项目结构:

./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

db 是在 app/__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

我哪里做错了?

1 个回答

3

你遇到了一个循环导入的问题。

你正在从 manage.py 文件中导入 create_appdbapi,这会导致导入 app.resources.changesAPI 模块。接着,这又会引发导入 app/resources 文件夹中的 __init__.py 文件,而这个文件又试图导入你的 models,但这时 db 还没有在 app/__init__.py 中定义,所以导入失败了。

你需要把导入 ChangesAPI 的代码移动到定义 db 之后,也就是在 app/__init__.py 文件中。任何在 app/__init__.py 中定义的名字,如果在 from app.resources.changesAPI import ChangesAPI 之前,就可以在你的子包中使用;如果在之后定义的,就不能用了。

撰写回答