首页 文章

ImportError:无法导入名称'foo'

提问于
浏览
0

我正在学习python并在第3行收到了我的第一个错误:

这是我的代码:

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并在终端执行: python platform\app.py 然后我收到此错误:

Traceback(最近一次调用最后一次):文件“platform \ app.py”,第4行,从平台导入设置中导入:导入错误:无法导入名称'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'
}

3 回答

  • 0

    您有一个名为 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
    
  • 1

    你有一切设置正常,我的猜测是你使用 settings.py 作为常量文件 . 而不是

    from platform import settings
    

    尝试相对地从文件中导入值(因为 app.pysettings.py 都在同一目录中)

    from settings import *
    

    然后你可以像使用它们一样

    print(FLASK_SERVER_NAME)
    

    虽然这样可以正常工作,但我喜欢这样做有点不同,以免最终试图弄清楚什么常数或功能来自哪里 . 这是我的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
    
  • -2

    您可以立即使用 import settings

相关问题