我正在运行相同的代码;以下内容可在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
函数。然后它爆发了。
答案 0 :(得分:1)
您正在使用该库的两个不同版本,而Windows上的版本早于0.53版本。从版本0.53开始,websocket
项目在绑定方法和常规函数之间区分了回调行为。
您正在传入绑定方法(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-client
来验证已安装的websocket.__version__
的版本:
>>> import websocket
>>> websocket.__version__
'0.54.0'