如何调试使用.run_forever()无限事件循环的Python websocket脚本
VSCode下调试WebSocket无限循环脚本的可行方案
方案1:直接在on_message回调内加断点调试
这是最直接的调试方案,run_forever()仅负责启动事件循环挂起主线程,事件触发的回调函数依然可以正常断点捕获:
- 打开脚本文件,找到
on_message函数内需要监控变量的位置,点击行号左侧空白处添加红圆点断点 - 按F5启动VSCode的Python调试模式,首次调试弹出配置选择时选「Python 文件」即可
- 脚本正常启动WebSocket连接进入
run_forever()循环后,每次收到消息触发on_message回调时,运行到断点位置会自动暂停 - 此时可在左侧调试面板的「变量」区查看所有局部、全局变量的实时值,也可在调试控制台输入变量名手动查询,还支持单步执行后续交易逻辑代码
方案2:埋点输出变量,适合无中断长期监控
如果不需要暂停运行,只想持续观测变量变化,可使用两种方式:
- 直接在
on_message对应位置加入打印语句,输出到控制台或日志文件:
def on_message(ws, message): global trade_list global in_position json_message = json.loads(message) candle = json_message['k'] # 按需打印监控变量 print(f"持仓状态:{in_position} | 交易列表长度:{len(trade_list)} | 最新收盘价:{candle['c']}") # ... 原有交易逻辑 ...
- 使用VSCode日志点代替普通断点:右键行号左侧空白处选择「添加日志点」,输入变量模板如
"持仓状态:{in_position}, K线时间:{candle['t']}",运行时不会暂停,只会在调试控制台输出指定内容,完全不干扰交易逻辑运行。
方案3:离线回放调试,避免重复请求交易所接口
如果需要复现特定行情场景,或不想调试时反复连接交易所,可先缓存历史消息再离线调试:
- 先临时修改
on_message函数,把收到的原始消息存到本地:
def on_message(ws, message): # 缓存原始消息到本地 with open("history_messages.txt", "a", encoding="utf-8") as f: f.write(message + "\n") # ... 原有逻辑 ...
- 调试时直接读取本地存储的历史消息,逐条传给
on_message函数执行,不需要启动WebSocket连接,完全脱离run_forever()循环,可以自由打断点、单步调试,方便定位问题。
补充:优雅中断循环的配置
可添加信号监听,支持按Ctrl+C主动关闭连接退出循环,避免异常报错:
import signal ws = websocket.WebSocketApp(socket, on_open=on_open, on_message=on_message, on_close=on_close) def signal_handler(sig, frame): ws.close() print("主动关闭连接") exit(0) signal.signal(signal.SIGINT, signal_handler) ws.run_forever(skip_utf8_validation=True)
调试阶段建议使用Binance测试网接口,避免误触发实盘交易。
内容的提问来源于stack exchange,提问作者Mo0rBy
相关产品推荐
相关产品推荐

