如何调试使用 `.run_forever()` 方法的 python websocket 脚本(无限事件循环)

问题描述 投票:0回答:2

我正在编写一个连接到 Binance websocket 的脚本,并使用

.run_forever()
方法不断从网站获取实时数据。我希望能够调试我的代码并观察变量值的变化,但我不知道如何做到这一点,因为脚本基本上挂在
.run_forever()
方法上,因为它是一个无限事件循环。这是设计使然,因为我想连续获取实时数据(它大约每秒收到一条消息),但我想不出一种调试它的好方法。

我正在使用 VSCode,这里有一些代码片段,可帮助理解我的问题。 websocket的消息函数只是一堆技术分析和交易逻辑,但它也是包含我想观察的所有变化变量的函数。

socket = f"wss://stream.binance.com:9443/ws/{Symbol}@kline_{interval}"

def on_open(ws):
    print("open connection")

def on_message(ws, message):
    global trade_list
    global in_position
    json_message = json.loads(message)
    
    candle = json_message['k'] # Accesses candle data

...[trade logic code here]...

def on_close(ws):
    print("Websocket connection close")


# ------------------------- Define a websocket object ------------------------ #
ws = websocket.WebSocketApp(socket, on_open=on_open, on_message=on_message, on_close=on_close)

ws.run_forever()

如果需要更多代码来回答这个问题,那么我可以编辑这个问题以包含它(我想如果你想知道我想查看哪些变量,我只是认为这会更容易并且显示这些部分更简单)。

另外,我知道使用

global
不太好,一旦我完成(或接近完成)脚本,我想去整理一下,然后我会处理它。

python-3.x websocket infinite-loop vscode-debugger
2个回答
2
投票

我参加聚会有点晚了,但声明

websocket.enableTrace(True)

为我工作。将其放在定义 Websocket 对象之前,它将打印进出 Websocket 的所有流量,包括处理消息时可能遇到的任何异常。


0
投票

您提到调试代码是第一项,因此请注意,默认情况下,WebSocketApp 甚至会在其回调函数中吞掉 Python 运行时错误。这意味着拼写错误可能会使代码默默地出现功能障碍,如果您不知道错误抑制,这将是一个真正令人头痛的问题。

最初,在开发代码时,您可能希望将运行时错误发送到终端的标准错误流,因此由于 websockets 使用日志记录模块来处理错误,因此以下内容可以实现这一点:

import logging
logging.basicConfig(format="%(message)s", level=logging.DEBUG )
© www.soinside.com 2019 - 2024. All rights reserved.