如何诊断和修复启动后立即崩溃的 flask/werkzeug 重新加载错误

How to diagnose and fix a flask/werkzeug reload error that crashes app immediately after startup

启动我的应用程序导致启动后立即崩溃。目前尚不清楚该错误可能意味着什么,因为它刚刚加载了它声称找不到的模块。

可能是转移注意力,但为什么会立即重启?

我能找到的关于此错误消息的大多数其他参考是当文件被作为脚本调用时,而不是——正如我已经做的那样——作为模块 (-m)

(.virtualenv3) rob@positron:~/Projects/<my_proj>/codebase/src$ source ../../.webapp.env && python3 -m webapp.main
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
INFO:werkzeug: * Running on http://0.0.0.0:8002/ (Press CTRL+C to quit)
INFO:werkzeug: * Restarting with stat
/home/rob/Projects/<myproj>/.virtualenv3/bin/python3: Error while finding module specification for 'webapp.main' (ModuleNotFoundError: No module named 'webapp')

编辑 1: 这里有一些输出表明调用方法确实适用于同一包中的 python 模块(尽管是基本测试)

(.virtualenv3) rob@positron:~/Projects/<myproj>/codebase/src$ ls -la webapp/*.py
-rw-r--r-- 1 rob rob     0 Sep  9 15:37 webapp/__init__.py
-rw-r--r-- 1 rob rob 11494 Dec 13 13:19 webapp/main.py
-rw-r--r-- 1 rob rob    19 Dec 13 13:36 webapp/test.py
(.virtualenv3) rob@positron:~/Projects/<myproj>/codebase/src$ python -m webapp.test
Hello SO  
(.virtualenv3) rob@positron:~/Projects/<myproj>/codebase/src$ python -m webapp.main
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
INFO:werkzeug: * Running on http://0.0.0.0:8812/ (Press CTRL+C to quit)
INFO:werkzeug: * Restarting with stat
/home/rob/Projects/<myproj>/.virtualenv3/bin/python: Error while finding module specification for 'webapp.main' (ModuleNotFoundError: No module named 'webapp')

编辑 2. PYTHONPATH=$(pwd) python -m .... 使它工作,但为什么需要这个?只是为了让 werkzeug 玩得开心?

编辑 3. 已诊断 Flask 正在更改进程的 CWD。

这是一个测试文件(webapp/test.py)

import os
print('cwd: ', os.getcwd())
from flask import Flask

Flask(__name__).run(port=9991, debug=True)

当 werkzeug 在调试模式下重新加载应用程序时,观察 os.getcwd() 的输出变化

(.virtualenv3) rob@positron:~/Projects/<myproj>/codebase/src$ PYTHONPATH=`pwd` FLASK_ENV=development python -m webapp.test
cwd: /home/rob/Projects/<myproj>/codebase/src
 * Serving Flask app "test" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:9991/ (Press CTRL+C to quit)
 * Restarting with stat
cwd: /home/rob/Projects/<myproj>
 * Debugger is active!
 * Debugger PIN: 134-807-518

这是因为 "if" 您有可用的 dotenv,Flask 将 运行 它并假定找到的 .env 文件的位置是项目的根目录并切换到该位置。

感谢 Flask。不过还没有修复。

https://github.com/pallets/flask/blob/master/src/flask/cli.py#L607

https://github.com/pallets/flask/issues/3444

添加FLASK_SKIP_DOTENV=1

跳过os.chdir()