2017-01-14 2 views
1

Мой Колба проект структурирована следующим образом:Колба AttributeError: модуль 'приложение' имеет атрибута 'запустить'

my_project 
│ 
├── app 
│   ├── __init__.py 
│   ├── api 
│   ├── static 
│   └── templates 
├── config.py 
└── run.py 

приложение/__ init__.py:

from flask import Flask 

app = Flask(__name__) 

app.config.from_object('config') 

run.py

from app import app 

app.run(
    host=app.config.get('HOST', '0.0.0.0'), 
    port=app.config.get('PORT', 5000) 
) 

Это работало befo re, но я пытаюсь перенести свой проект с Python 2 на Python 3, а работающий python run.py больше не работает. Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "/Users/rasmi/Projects/my_project/run.py", line 3, in <module> 
    app.run(
AttributeError: module 'app' has no attribute 'run' 

Если изменить стиль импорта в run.py, чтобы соответствовать один here:

from .app import app 

app.run(
    host=app.config.get('HOST', '0.0.0.0'), 
    port=app.config.get('PORT', 5000) 
) 

я получаю другую ошибку:

Traceback (most recent call last): 
    File "/Users/rasmi/Projects/my_project/run.py", line 1, in <module> 
    from .app import app 
ModuleNotFoundError: No module named '__main__.app'; '__main__' is not a package 

Обмотка мой app.run() вызов в блоке if __name__ == '__main__': дает те же результаты. Что вызывает эту проблему?

ответ

0

Я исправил эту проблему, переименовав каталог app на что-то еще (например, webapp). Использование from webapp import app делает трюк. Кажется, это потому, что package directory names take precedence over module names when importing. Возможно, использование __path__ позволило бы обойти это.

0

Избавьтесь от . при импорте приложения и запустите приложение в if __name__ == '__main__':.

run.py

from app import app 

if __name__ == '__main__': 
    app.run(
     host=app.config.get('HOST', '0.0.0.0'), 
     port=app.config.get('PORT', 5000) 
    ) 

Командная строка

my_project$ python run.py 

Кроме того, если вы используете virtualenv убедитесь, что вы используете намеченную Python:

my_project$ which python; python --version 

Если вы есть *.pyc файлов около t чтобы удалить их.

+0

Я пробовал этот подход (см. Конец моего вопроса), и это не сработало. Я получаю ту же ошибку: 'AttributeError: module 'app' не имеет атрибута 'run'' – rasmi

+0

Единственный способ, которым я получаю объект' AttributeError:' module ', не имеет атрибута' run'', когда я заменяю 'приложение app app app 'с' import app'. – dm295

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