Flask调试模式下为何从$HOME读取文件?如何修正该问题?
Flask调试模式下从$HOME目录加载文件的问题解答
问题1:为什么调试模式下Flask会尝试从$HOME读取文件?
Flask开启debug=True时会启动自动重载器,用于监控代码变化并重启程序。出现该问题的核心原因是重载器调用了错误的Python解释器(这里是/opt/bin/python3,而非你当前使用的Anaconda解释器/Users/mark/opt/anaconda3/bin/python3),且该解释器在启动时将工作目录切换到了你的$HOME(/Users/mark)。
当你在/tmp目录用python3 test_flask.py启动程序时,主进程用的是Anaconda的Python,但重载器可能通过系统PATH找到了优先级更高的/opt/bin/python3,这个解释器尝试加载相对路径test_flask.py时,会以当前工作目录($HOME)为基准查找,自然找不到/tmp下的文件。
另外,Flask重载器在未获取到脚本绝对路径的情况下,会默认以当前解释器的工作目录作为路径基准,进一步加剧了路径解析错误。
问题2:如何阻止该行为,让它从程序所在目录重新加载?
提供几种可行的解决方法:
方法1:用绝对路径启动脚本
在/tmp目录下,直接使用脚本的绝对路径启动,让重载器明确文件位置:
python3 /tmp/test_flask.py
方法2:显式指定使用Anaconda的Python解释器
避免系统解释器被重载器调用,直接用当前环境的Python绝对路径启动:
/Users/mark/opt/anaconda3/bin/python3 test_flask.py
方法3:用Flask命令行工具启动
使用flask run命令,配合环境变量指定应用和调试模式,它会自动识别当前工作目录下的脚本:
cd /tmp FLASK_APP=test_flask.py FLASK_DEBUG=1 flask run
方法4:在代码中显式设置脚本绝对路径
修改代码,让重载器监控正确的文件路径:
import os import flask app = flask.Flask(__name__) @app.route('/foo', methods=['GET']) def foo(): pass if __name__ == "__main__": # 获取当前脚本的绝对路径 script_abspath = os.path.abspath(__file__) # 启动调试模式时,指定重载器监控的文件 app.run(debug=True, extra_files=[script_abspath])
方法5:关闭自动重载(仅临时测试用)
如果不需要自动重载功能,可以直接关闭重载器:
app.run(debug=True, use_reloader=False)
内容的提问来源于stack exchange,提问作者Mark Harrison
相关产品推荐
相关产品推荐

