Python模块导入难题(子模块中的模块)
我有一个这样的项目结构:
./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_app
、db
和 api
,这会导致导入 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
之前,就可以在你的子包中使用;如果在之后定义的,就不能用了。