2017-02-22 4 views
0

Я изучаю питон и получил свою первую ошибку в строке 3:ImportError: не может импортировать имя 'Foo'

вот мой код:

app.py

import logging.config 

from flask import Flask, Blueprint 
from platform import settings 

app = Flask(__name__) 


def main(): 
    app.run(debug=settings.FLASK_DEBUG) 

if __name__ == "__main__": 
    main() 

и моя файловая структура такова:

project_name 
|--platform 
| |--api 
| |--database 
| |-- __init__.py 
| |-- app.py 
| |-- settings.py 
|--logging.conf 
|--requirements.txt 
|--readme.md 
|--setup.cfg 

Я использую PyCharm IDE и ex ecute в терминале: python platform\app.py затем я получаю эту ошибку:

Traceback (most recent call last):

File "platform\app.py", line 4, in

from platform import settings

ImportError: cannot import name 'settings'

идеи, что случилось здесь?

вот мой settings.py

# Flask settings 
FLASK_SERVER_NAME = 'localhost:5000' 
FLASK_DEBUG = True # Do not use debug mode in production 

# Flask-Restplus settings 
RESTPLUS_SWAGGER_UI_DOC_EXPANSION = 'list' 
RESTPLUS_VALIDATE = True 
RESTPLUS_MASK_SWAGGER = False 
RESTPLUS_ERROR_404_HELP = False 

# MYSQL settings 
MYSQL_DATABASE_URI = 'blablalba' 
MYSQL_TRACK_MODIFICATIONS = False 

PYMYSQL_CONNECTION = { 
    'host': '123.456.789.111', 
    'port': 3306, 
    'user': 'root', 
    'passwd': 'password', 
    'db': 'database' 
} 
+0

Я думаю, что 'settings' должен быть функцией, а не файлом. –

+0

Что происходит, если вы выполняете 'python -m platform.settings'? –

+0

@MadPhysicist, я запускаю это в терминале, ничего не происходит, просто пустая строка новой строки – AnD

ответ

1

У вас есть пакет с именем platform, но вы пытаетесь выполнить сценарий в нем. Когда вы это сделаете, сценарий будет запущен независимо, без информации о пакете, потому что сценарий не импортируется. Для того, чтобы сделать правильный импорт, а затем запустить в качестве сценария, используйте -m вариант:

python -m platform.app 

Это будет импортировать сценарий из platform пакета, созданных зависимости правильно и т.д.

Как правило, вы бы по этой причине захотите разместить исполняемый скрипт вне основного пакета. Если вы измените структуру папок, чтобы посмотреть, как это, команда python app.py должна работать нормально, потому что platform будет признан пакет:

 

project_name 
|--platform 
| |--api 
| |--database 
| |-- __init__.py 
| |-- settings.py 
|-- app.py 
|--logging.conf 
|--requirements.txt 
|--readme.md 
|--setup.cfg 

Наконец, в качестве второстепенного придираться, если вы решили сохранить app.py в пакете а не на уровне проекта, я бы рекомендовал использовать относительный импорт для получения настроек:

from . import settings 
+0

спасибо, так вы говорите, что я должен использовать: 'python -m platform.app' для выполнения app.py? вместо 'python platform \ app.py'? он показывает мне хороший прогресс, но если в моем: 'def main()' у меня есть 'app.run (debug = settings.FLASK_DEBUG)' он меня выбросит 'ImportError: не могу снова импортировать имя 'settings' '. если я изменяю 'app.run (debug = settings.FLASK_DEBUG)' в 'app.run()' он работает хорошо, но это заставляет меня путать ... – AnD

+0

, то как мне получить доступ к settings.FLASK_DEBUG, а затем передать его в приложение .run (здесь)? – AnD

+0

@AnD, где находится 'main' и как выглядит импорт. отправьте этот код в свой вопрос –

0

У вас есть все настройки нормально, я думаю, что вы используете settings.py в виде файла констант. поэтому вместо

from platform import settings 

пытаются импортировать значения из файла относительно (так как app.py и settings.py находятся в том же каталоге)

from settings import * 

, а затем вы можете использовать их как

print(FLASK_SERVER_NAME) 

Хотя это будет работать нормально, но мне нравится делать это немного по-другому, чтобы не почесать голову, пытаясь выяснить, что такое константа или функция com откуда откуда. Вот мои 2 цента

import settings.py as configs # or any variable name you want to use 

print(configs.FLASK_SERVER_NAME) 
# more understandable as now you know FLASK_SERVER_NAME is coming from configs 
+0

спасибо, но я попробовал: 'import settings.py как configs', но я получил это:' ImportError: Нет модуля с именем 'settings.py'; 'settings' не является пакетом' – AnD

+0

Можете ли вы сказать мне, в какой директории вы пытаетесь запустить и какую команду используете? Это просто проблема относительных путей в вашем случае. –

+0

Привет, я запустил: python platform/app.py, который внутри папки платформы – AnD

-2

Вы можете сразу использовать import settings вместо

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