我正在运行相同的代码;以下适用于 Windows,但将在 Ubuntu (16.04) 上正确运行。
import websocket
import json
class WhatEver(object):
def __init__(self):
self.ws = websocket.WebSocketApp(
'wss://beijing.51nebula.com/',
on_message=self.on_ws_message,
on_open=self.on_open
)
def rin_forever(self):
print("start run forever")
self.ws.run_forever()
def on_ws_message(self, ws,message):
print (message)
self.ws.close()
def _send_msg(self, params):
call = {"id": 1, "method": "call",
"params": params}
self.ws.send(json.dumps(call))
def on_open(self, ws):
print("start open function")
self._send_msg([1, "login", ["",""]])
if __name__ == '__main__':
ws=WhatEver()
print("start")
ws.rin_forever()
print("close")
我已经尝试重新安装所有模块(包括 Windows 和 Ubuntu 之间相同版本的 Python 和 websocket
),此代码在 Windows 系统上的打印是正确的:
start
start run forever
start open function
{"id":1,"jsonrpc":"2.0","result":true}
close
但是当它在 Ubuntu 中运行时,虽然它会打印,但它会遗漏一些打印语句:
start
start run forever
close
当我在 Ubuntu 中调试代码时,我发现主线程停止在 self.ws.run_forever()
调用中并且永远不会跳转到 on_open
函数。然后它爆发了。
最佳答案
您正在使用两个不同版本的库,Windows 上的版本低于 0.53 版。从 0.53 版开始,websocket
项目区分了绑定(bind)方法和常规函数之间的回调行为。
您正在传递绑定(bind)方法(self.on_open
和 self.on_ws_message
),此时 ws
参数是 没有传入。这些方法显然已经可以通过它们的实例访问 websocket,可能是因为预期的用例是 create a subclass from the socket class。 .
不幸的是,项目没有对此进行记录,更改 appears to have been causing problems for more people .
因此对于 0.53 和更新版本,从回调中删除 ws
参数:
class WhatEver(object):
def __init__(self):
self.ws = websocket.WebSocketApp(
'wss://beijing.51nebula.com/',
on_message=self.on_ws_message,
on_open=self.on_open
)
# ...
def on_ws_message(self, message):
print(message)
self.ws.close()
# ...
def on_open(self):
print("start open function")
self._send_msg([1, "login", ["", ""]])
您可以通过启用日志记录来发现此类问题; websocket
模块将它在回调中遇到的异常记录到 logger.getLogger('websocket')
记录器。查看这些问题的一种快速方法是启用跟踪:
websocket.enableTrace(True)
它仅向该日志记录对象添加一个日志记录处理程序,为该对象打开 logging.DEBUG
级别的报告,此外还启用完整的套接字数据回显。
或者您可以配置日志记录以输出一般消息 logging.basicConfig()
function :
import logging
logging.basicConfig()
它可以让您看到 logging.ERROR
级及以上级别的消息。
使用后一个选项,打印出未更正版本的代码:
start
start run forever
ERROR:websocket:error from callback <bound method WhatEver.on_open of <__main__.WhatEver object at 0x1119ec668>>: on_open() missing 1 required positional argument: 'ws'
close
您可以通过打印 websocket.__version__
来验证您安装的 websocket-client
的版本:
>>> import websocket
>>> websocket.__version__
'0.54.0'
关于python - Websocket 代码适用于 Windows 但不适用于 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100975/