My Flask项目的结构如下:
my_project
│
├── app
│ ├── __init__.py
│ ├── api
│ ├── static
│ └── templates
├── config.py
└── run.py
应用/ __初始化__吡啶:
from flask import Flask
app = Flask(__name__)
app.config.from_object('config')
run.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
中的导入样式以匹配here:
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__':
块中会产生相同的结果。是什么导致了这个问题?
答案 0 :(得分:5)
我通过将app
目录重命名为其他内容(例如webapp
)来解决此问题。使用from webapp import app
可以解决问题。这似乎是因为package directory names take precedence over module names when importing。也许使用__path__
可以让人解决这个问题。
答案 1 :(得分:0)
导入应用时摆脱.
并在if __name__ == '__main__':
中运行应用。
<强> run.py 强>
from app import app
if __name__ == '__main__':
app.run(
host=app.config.get('HOST', '0.0.0.0'),
port=app.config.get('PORT', 5000)
)
命令行
my_project$ python run.py
此外,如果您使用的是virtualenv
,请确保使用的是预期的Python:
my_project$ which python; python --version
如果您有*.pyc
个文件,请尝试删除这些文件。
答案 2 :(得分:0)
我的应用程序中的以下行遇到相同的问题,
import app.main.constant.constants as Constants
但是随后我将上面的命令重组为下面的命令,并且对我有用。
from app.main.constant import constants as Constants
答案 3 :(得分:0)
我在runserver.py
中做到了这一点:
from WebApp import app
app.app.run(debug=True)
其中包的名称是Webapp。注意我如何两次使用app
。另外,我的Flask应用程序名为app
。
├── WebApp
│ ├── app.py
│ ├── authentication.py
│ ├── __init__.py
│ ├── models.py
├── runserver.py