Flask AttributeError:模块“ app”没有属性“ run”

ras*_*smi 4 python python-import flask python-2.7 python-3.x

我的Flask项目的结构如下:

my_project
?
??? app
?   ??? __init__.py
?   ??? api
?   ??? static
?   ??? templates
??? config.py
??? run.py
Run Code Online (Sandbox Code Playgroud)

app / __ init__.py

from flask import Flask

app = Flask(__name__)

app.config.from_object('config')
Run Code Online (Sandbox Code Playgroud)

运行

from app import app

app.run(
    host=app.config.get('HOST', '0.0.0.0'),
    port=app.config.get('PORT', 5000)
)
Run Code Online (Sandbox Code Playgroud)

这以前曾奏效,但是我试图将我的项目从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 Code Online (Sandbox Code Playgroud)

如果我更改导入样式run.py以匹配此处的样式:

from .app import app

app.run(
    host=app.config.get('HOST', '0.0.0.0'),
    port=app.config.get('PORT', 5000)
)
Run Code Online (Sandbox Code Playgroud)

我收到另一个错误:

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
Run Code Online (Sandbox Code Playgroud)

将我的app.run()电话包裹在一个if __name__ == '__main__':块中会产生相同的结果。是什么导致此问题?

ras*_*smi 6

我通过将app目录重命名为其他名称(例如webapp)来解决此问题。使用from webapp import app就可以了。这似乎是因为在导入时,程序包目录名称优先于模块名称。也许使用__path__它可以解决这个问题。