You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调试使用.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:离线回放调试,避免重复请求交易所接口

如果需要复现特定行情场景,或不想调试时反复连接交易所,可先缓存历史消息再离线调试:

  1. 先临时修改on_message函数,把收到的原始消息存到本地:
def on_message(ws, message):
    # 缓存原始消息到本地
    with open("history_messages.txt", "a", encoding="utf-8") as f:
        f.write(message + "\n")
    # ... 原有逻辑 ...
  1. 调试时直接读取本地存储的历史消息,逐条传给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:54:01