python模块导入难题(来自子模块的模块)

时间:2014-07-28 13:43:21

标签: python python-2.7 flask sqlalchemy flask-restful

我有以下项目结构:

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

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您有循环导入。

您要从create_app导入dbapimanage.py,这会触发导入app.resources.changesAPI模块,然后触发导入__init__.py中的app/resources包然后会尝试导入您的models,但由于db中尚未定义app/__init__.py,因此会失败。

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