使用IDLE运行Flask-SocketIO代码时遇Shell重启及异常日志问题
解决IDLE中运行Flask-SocketIO代码导致Shell重启的问题
嘿,我碰到过类似的情况!IDLE本身和Flask-SocketIO的自动重载机制有点冲突,这大概率是导致Shell直接重启的原因。
先给你拆解下问题:Flask-SocketIO默认会开启自动重载(就是你看到的Restarting with stat),但IDLE的Shell环境没办法很好地兼容这种进程重启的操作,直接就触发了Shell重启,还打断了日志输出,所以你只能看到半截回溯。
给你几个实用的解决办法:
关闭Flask-SocketIO的自动重载:在初始化SocketIO的时候加上
use_reloader=False参数(或者直接关闭debug模式debug=False),示例代码如下:from flask import Flask from flask_socketio import SocketIO app = Flask(__name__) # 关闭自动重载,避免和IDLE冲突 socketio = SocketIO(app, use_reloader=False) @socketio.on('message') def handle_message(data): print('received message:', data) if __name__ == '__main__': socketio.run(app)这样就不会触发进程自动重启,IDLE的Shell也能正常运行代码并输出完整日志了。
换用命令行运行代码:IDLE的Shell确实不是运行这类带实时通信框架代码的最佳选择,你可以直接打开系统的命令提示符/终端,用
python your_script.py来运行,这样不仅能看到完整的日志,自动重载机制也能正常工作。检查依赖版本兼容性:有时候Flask、Flask-SocketIO和其依赖的异步库(比如gevent)版本不匹配,也会导致这类奇怪的崩溃。你可以试着更新下相关依赖:
pip install --upgrade flask flask-socketio
另外,你提到加了print(3)只看到半截日志,这就是因为自动重载触发后,IDLE的Shell还没来得及输出完整内容就被强制重启了,关闭自动重载后应该就能看到完整的打印信息和日志了。
内容的提问来源于stack exchange,提问作者Man jpeglover
相关产品推荐
相关产品推荐

