VSCode中websocket-client的on_open与on_message函数无法识别WebSocket对象,Binance WebSocket数据获取失败求助
我在从Binance WebSocket获取数据时遇到了一个奇怪的问题:相同的代码在Google Colab里能正常打印数据,但在VSCode中运行时屏幕没有任何输出,而且感觉on_open和on_message里的ws对象好像没被识别。我的代码如下:
import websocket cc = "btcusdt" interval = "1m" socket = f"wss://stream.binance.com:9443/ws/{cc}@kline_{interval}" #print(socket) def on_message(ws, message): print(message) def on_close(ws): print("### closed ###") ws = websocket.WebSocketApp(socket,on_message=on_message, on_close=on_close) ws.run_forever()
可能的原因及解决方案
我之前碰到过类似的情况,大概率是下面几个因素导致的,咱们一步步排查:
1. Python环境依赖问题(最常见)
Colab默认预装了websocket-client包,但你的VSCode本地Python环境可能没装这个包,或者装了错误的包(注意:不是websocket包,而是websocket-client——这是两个不同的库,代码里用的websocket.WebSocketApp属于前者)。
解决步骤:
- 打开VSCode的终端,运行命令安装/升级依赖:
pip install websocket-client # 如果已经安装,尝试升级到最新版本 pip install --upgrade websocket-client - 确认VSCode使用的Python环境是你安装了依赖的那个:点击VSCode右下角的Python版本号,通过
Python: Select Interpreter切换到正确的环境。
2. 输出缓冲导致内容没实时显示
VSCode的终端有时候会启用输出缓冲,导致print的内容不会立刻显示出来,尤其是在长时间运行的程序里。
解决步骤:
修改print语句,加上flush=True参数强制刷新输出:
def on_message(ws, message): print(message, flush=True) def on_close(ws): print("### closed ###", flush=True)
3. 缺少连接状态回调,无法排查连接问题
你的代码没有定义on_open和on_error回调,没法知道WebSocket是否成功建立连接,或者有没有发生错误。
解决步骤:
补充这两个回调函数,帮你定位问题:
def on_open(ws): print("WebSocket连接已成功建立!", flush=True) def on_error(ws, error): print(f"连接发生错误: {error}", flush=True) # 初始化WebSocketApp时加上这两个回调 ws = websocket.WebSocketApp( socket, on_message=on_message, on_close=on_close, on_open=on_open, on_error=on_error )
如果运行后看到on_error的输出,就能直接知道是网络错误还是其他问题;如果看到on_open的输出,说明连接正常,那问题可能出在输出缓冲或者后续的数据处理上。
4. 网络/代理拦截问题
VSCode所在的机器可能有防火墙、代理软件(比如VPN、浏览器代理)拦截了WebSocket连接,而Colab的云端环境没有这个限制。
解决步骤:
- 暂时关闭代理软件、防火墙,或者切换到手机热点测试。
- 用浏览器的开发者工具测试WebSocket连接:打开浏览器,按F12进入开发者工具→网络→筛选"WS",然后访问
wss://stream.binance.com:9443/ws/btcusdt@kline_1m,看是否能成功建立连接并收到数据。
修改后的完整代码
把上面的优化点整合起来,完整代码如下:
import websocket cc = "btcusdt" interval = "1m" socket = f"wss://stream.binance.com:9443/ws/{cc}@kline_{interval}" def on_open(ws): print("WebSocket连接已成功建立!", flush=True) def on_message(ws, message): print(message, flush=True) def on_close(ws): print("### closed ###", flush=True) def on_error(ws, error): print(f"连接发生错误: {error}", flush=True) ws = websocket.WebSocketApp( socket, on_message=on_message, on_close=on_close, on_open=on_open, on_error=on_error ) ws.run_forever()
按照上面的步骤排查,应该能解决VSCode里无输出的问题。
内容的提问来源于stack exchange,提问作者useeeeer132

