Python Websocket代码可以在Windows上工作,但不能在Linux上工作
我正在运行相同的代码;以下内容在Windows中运行,但将在Ubuntu 16.04上正确运行Python Websocket代码可以在Windows上工作,但不能在Linux上工作,python,linux,windows,websocket,python-3.6,Python,Linux,Windows,Websocket,Python 3.6,我正在运行相同的代码;以下内容在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_messa
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\u forever调用中停止,并且从不跳转到on\u open函数。然后它爆发了。您正在使用两个不同版本的库,Windows上的版本比0.53版本旧。从版本0.53开始,websocket项目区分绑定方法和常规函数之间的回调行为 您正在传入绑定方法self.on_open和self.on_ws_消息,此时ws参数不会传入。显然,这些方法应该已经通过它们的实例访问websocket,这可能是因为预期的用例是 不幸的是,项目和变更没有对此进行记录 因此,对于版本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'logger时记录遇到的异常。查看这些问题的快速方法是启用跟踪:
websocket.enableTrace(True)
它只向该日志记录对象添加日志记录处理程序,为该对象打开logging.DEBUG级别的报告,并启用完整套接字数据回显
或者,您可以配置日志记录以输出消息,通常使用:
这使您可以查看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的版本。
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
>>> import websocket
>>> websocket.__version__
'0.54.0'