关于python:ImportError:无法导入名称’foo’

ImportError: cannot import name 'foo'

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

这是我的代码:

App.Py

1
2
3
4
5
6
7
8
9
10
11
12
13
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()

我的文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
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 (most recent call last):

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

from platform import settings

ImportError: cannot import name 'settings'

知道这里怎么了吗?

这是我的设置.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 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'
}


您有一个名为platform的包,但您正试图在其中执行一个脚本。当您这样做时,脚本将独立运行,不包含任何包信息,因为没有导入脚本。要正确导入并作为脚本运行,请使用-m选项:

1
python -m platform.app

这将从platform包导入脚本,正确设置依赖项等。

通常,出于这个确切的原因,您希望将可执行脚本放在主包之外。如果您将文件夹结构修改成这样,那么命令python app.py应该运行得很好,因为platform将是一个可识别的包:

1
2
3
4
5
6
7
8
9
10
11
project_name
|--platform
|  |--api
|  |--database
|  |-- __init__.py
|  |-- settings.py
|-- app.py
|--logging.conf
|--requirements.txt
|--readme.md
|--setup.cfg

最后,作为一个小吹毛求疵,如果您决定将app.py保持在包级别而不是项目级别,我建议使用相对导入来获取设置:

1
from . import settings


你的一切设置都很好,我猜你在使用settings.py作为常量文件。所以不是

1
from platform import settings

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

1
from settings import *

然后你可以像

1
print(FLASK_SERVER_NAME)

虽然这会很好,但我喜欢做的有点不同,以免最后抓我的头,试图找出常数或函数来自何处。这是我的2美分

1
2
3
4
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


你可以直接用import settings代替