2015-05-15 2 views
1

Я пытаюсь импортировать noun0.routes из следующей структуры упаковки, но получаю ImportError: cannot import name db. Почему я получаю эту ошибку и как ее исправить?ImportError при импорте двух уровней вверх

├── some_rest_api 
│   ├── noun0 
│   │   ├── __init__.py 
│   │   ├── models.py 
│   │   ├── routes.py 
│   ├── noun1 
│   │   ├── __init__.py 
│   │   ├── models.py 
│   │   ├── routes.py 
│   ├── routes.py 
│   ├── utils.py 
│ └── __init__.py 
├── requirements.txt 
└── setup.py 

some_rest_api/__init__.py

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

from noun0.routes import noun0_api 

app = Flask(__name__) 
db = SQLAlchemy(app) 
app.register_blueprint(noun0_api) 

some_rest_api/noun0/models.py

from some_rest_api import db 
+0

Поскольку переключение на бутылку нет ошибки были найдены :) –

+0

Хотя здорово, что переход на бутылку помог вам, это не действительно приемлемое решение вашего вопроса. Кроме того, неясно, как в этом случае поможет переход на бутылку, поскольку это проблема импорта, а не проблема фреймворка. Помог ли мой ответ понять, в чем проблема? – davidism

ответ

2

Вы создали ситуацию импорта круговой. __init__.py импорт noun0.routes, который импортирует noun0.models, который пытается импортировать db. Тем не менее, __init__.py не достиг точки, где он определил db, он все еще пытается завершить импорт.

Переместить импорт маршрута после того, как будут определены все их определения (или их цепочка импорта).

app = Flask(__name__) 
db = SQLAlchemy(app) 

from some_rest_api.noun0.routes import noun0_api 

app.register_blueprint(noun0_api) 

This situation is mentioned in the Flask docs at the bottom of this page.


Я изменил свой импорт из from noun0.routes в from some_rest_api.noun0.routes. Вы используете старый, подверженный ошибкам образец относительного импорта. Это поведение было удалено в Python 3. Всегда лучше использовать абсолютный импорт (как и я) или использовать точечную нотацию для относительного импорта: from .. import db говорит: «Поднимитесь на два уровня от того места, где я есть.

Смежные вопросы