flask 运行 未找到模块导入但可与 gunicorn 一起使用

flask run not finding module import but works with gunicorn

像这样启动 Flask 时出现模块未找到错误:

$ python src/app/main.py

$ python src/app/main.py
Traceback (most recent call last):
  File "/home/james/code/webapp/src/app/main.py", line 3, in <module>
    from app.web import app_config
ModuleNotFoundError: No module named 'app'

目录:

src
 |- app    
 |- |- __init__.py
 |- |- main.py
 |- |- web
 |- |- |- __init__.py
 |- |- |- app_config.py

main.py :

from flask import Flask

from app.web import app_config


app = Flask(__name__)


@app.get("/ping")
def ping():

    return "pong"

if __name__ == "__main__":

    app.run(debug=True)

但是如果我用 gunicorn 启动它就没问题了:

$  gunicorn app.main:app
[2022-01-22 15:28:58 +0000] [148] [INFO] Starting gunicorn 20.1.0
[2022-01-22 15:28:58 +0000] [148] [INFO] Listening at: http://127.0.0.1:8000 (148)
[2022-01-22 15:28:58 +0000] [148] [INFO] Using worker: sync
[2022-01-22 15:28:58 +0000] [150] [INFO] Booting worker with pid: 150

为什么直接来自终端的 运行 Flask 不让它找到更高级别的目录模块?

由于 Module Search Path of Python,未找到 app 模块。它尝试从 main.py 的目录导入。

如果您不想更改任何内容,cd 进入 src/ 目录,然后从那里使用“模块方法”运行 应用程序:

$ python -m app.main

第二种方法:将 from app.web import app_config 行更改为 from web import app_config,然后原来的 python src/app/main.py 将起作用,因为现在它从 main.py.

导入相对值

第三个选项:将 src 目录的完整路径添加到 PYTHONPATH env var.