我的 Flask 项目结构如下:
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')
运行.py
from app import app
app.run(
host=app.config.get('HOST', '0.0.0.0'),
port=app.config.get('PORT', 5000)
)
这以前有效,但我正在尝试将我的项目从 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
中的导入样式以匹配 此处 的样式:
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__':
块产生相同的结果。是什么导致了这个问题?
原文由 rasmi 发布,翻译遵循 CC BY-SA 4.0 许可协议
我通过将
app
目录重命名为其他名称(例如webapp
)解决了这个问题。使用from webapp import app
就可以了。这似乎是因为 包目录名称在导入时优先于模块名称。也许使用__path__
可以解决这个问题。